Mysql: запрос в запросе (подзапрос) не работает - PullRequest
0 голосов
/ 13 июня 2019

Я хочу выполнить запрос MySQL к таблице, а затем подзапрос этой таблицы. У меня есть список объектов. Каждый объект имеет мажорную и минорную версию. Для одного объекта, который я пытаюсь найти, это «ПОСЛЕДНЯЯ ВЕРСИЯ» этого объекта: это означает, что я хочу найти максимальное (основное) для этого объекта, а затем максимальное (дополнительное) для последнего результата.

Я создаю «тестовую» базу данных MySQL:

create database test ;  
use test ;

Я создал таблицу:

create table test 
(  
    id int auto_increment,   
    object varchar(10),   
    major int,   
    minor int,  
    PRIMARY KEY (`id`)  
) engine innodb;  

Я заполняю эту таблицу данными:

insert into test (object, major, minor) values ('obj1',1,0) ;  
insert into test (object, major, minor) values ('obj1',1,1) ;  
insert into test (object, major, minor) values ('obj1',1,2) ;  
insert into test (object, major, minor) values ('obj1',2,0) ;  
insert into test (object, major, minor) values ('obj1',2,1) ;  

Я перечисляю таблицу: выбрать * из теста;

+----+--------+-------+-------+  
| id | object | major | minor |  
+----+--------+-------+-------+  
|  1 | obj1   |     1 |     0 |  
|  2 | obj1   |     1 |     1 |  
|  3 | obj1   |     1 |     2 |  
|  4 | obj1   |     2 |     0 |  
|  5 | obj1   |     2 |     1 |  
+----+--------+-------+-------+  

5 строк в наборе (0,01 с)

Первый запрос - получить максимальные (основные) строки:

select * 
from test 
where object = 'obj1' 
  and major = (select max(major) from test);

с таким результатом:

+----+--------+-------+-------+  
| id | object | major | minor |  
+----+--------+-------+-------+  
|  4 | obj1   |     2 |     0 |  
|  5 | obj1   |     2 |     1 |  
+----+--------+-------+-------+  

2 ряда в наборе (0,00 с)

Затем я пытаюсь получить минор 0 версии:

select * 
from 
    (select * 
     from test 
     where object = 'obj1' 
       and major = (select max(major) from test)) as t 
where 
    t.minor = 0 ;

и все работает, результат:

+----+--------+-------+-------+  
| id | object | major | minor |  
+----+--------+-------+-------+  
|  4 | obj1   |     2 |     0 |  
+----+--------+-------+-------+  

но я хочу ПОСЛЕДНЮЮ ВЕРСИЮ, поэтому я хочу найти максимальное (младшее), которое равно 1:

select * 
from 
    (select * 
     from test 
     where object = 'obj1' 
       and major = (select max(major) from test)) as t 
where 
    t.minor = (select max(minor) from t) ;

И я получаю ошибку:

ОШИБКА 1146 (42S02): таблица 'test.t' не существует

Я не понимаю, почему это не работает.

Спасибо

Ответы [ 3 ]

2 голосов
/ 13 июня 2019
select * from test where object = 'obj1' order by major desc, minor desc limit 1;

Сначала мы сортируем таблицу так, чтобы все строки с наибольшими значениями старшего столбца шли первыми (порядок по старшим деск ). Если есть какие-либо строки с одинаковым значением для основного столбца, мы затем «разрываем связи», упорядочивая строки с одинаковыми значениями для основного столбца, упорядочивая их так, чтобы строки с самыми большими значениями вспомогательного столбца были первыми ( минор деск ). Таким образом, вывод первой строки будет строкой с наибольшим значением major и для этого значения major наибольшим значением minor. Поскольку нас интересует только эта первая строка, мы ограничиваем вывод одной строкой ( limit 1 ).

0 голосов
/ 13 июня 2019

заменить

select * from (select * from test where object='obj1' and major=(select max(major) from test) ) as t where t.minor=(select max(minor) from t)

в

select * from (select * from test where object='obj1' and major=(select max(major) from test) ) as t where t.minor=(select max(minor) from test)

потому что вы упомянули t вместо теста в последнем подзапросе

0 голосов
/ 13 июня 2019

вы можете добиться того же с помощью запроса ниже

select * from test where object='obj1' and major=(select max(major) from test)
and minor = (
select max(minor) from test where object='obj1' and major=(select max(major) from test )
  )

это даст результат ниже

+----+--------+-------+-------+
| id | object | major | minor |
+----+--------+-------+-------+
| 5 | obj1 | 2 | 1 |
+----+--------+-------+-------+
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...