Deutsch
Germany.ruФорумы → Архив Досок→ Программирование

any, all mySQL

386  
melodi_ постоялец10.06.21 09:54
NEW 10.06.21 09:54 
Последний раз изменено 10.06.21 10:08 (melodi_)

Может кто нибудь обьяснить, почему я три строки получаю. У меня для теста таблица с самолетами и с колличеством мест в самолете. Я для теста колличество мест изменила на 1,2,3...

Моя задача селектировать 3 самолета с самым большим колличеством мест. Например есть самолеты с кол-вом мест 5,4,3,2,1. Мне нужны самолеты 5,4,3. Колличество мест разное.

Мой вариант:

select id, no_seats, type, name from plane

where no_seats = (select max(no_seats) from plane) or no_seats <> all (select max(no_seats) from plane) and no_seats > any(select no_seats from plane);


Я ожидала, с (where no_seats = (select max(no_seats) from plane)) получить самолет 5 мест, с (no_seats <> all (select max(no_seats) from plane) ) отсеивает самолет 5 мест (максимальное), тогда с остатка (no_seats > any(select no_seats from plane)) выберается самолет, который самое большое кол-во мест из остаточных самолетов.

Я ожидала например из самолетов no_seats=1,2,3,4,5. Самолет 5 из за (where no_seats = (select max(no_seats) from plane)

и самолет 4 из за (or no_seats <> all (select max(no_seats) from plane) and no_seats > any(select no_seats from plane).


Но я получаю цамолеты 5,4,3. Почему 3 тоже дацу?

#1 
Программист коренной житель10.06.21 10:17
10.06.21 10:17 
в ответ melodi_ 10.06.21 09:54

Все это громадье вместо SELECT id, no_seats, type, name FROM plane ORDER BY no_seats DESC LIMIT 3; ?

#2 
melodi_ постоялец10.06.21 10:39
NEW 10.06.21 10:39 
в ответ Программист 10.06.21 10:17

Спасибо большое. Но интересно что проишодит в моей анфраге.

#3 
Программист коренной житель10.06.21 11:31
NEW 10.06.21 11:31 
в ответ melodi_ 10.06.21 10:39, Последний раз изменено 10.06.21 11:31 (Программист)

Пусть у нас в таблице 6 самолетов с количеством мест: 1, 2, 3, 4, 5, 5


Expr1:

no_seats = (select max(no_seats) from plane)

Возвращает все самолеты с максимальным количеством мест. (результат: 2 строки с самолетами по 5 мест)


Expr2:

no_seats <> all (select max(no_seats) from plane)

Возвращает все самолеты, количество мест в которых меньше, чем максимальное. (4 строки с самолетами с местами 1, 2, 3, 4)


Expr3:

no_seats > any(select no_seats from plane)

Возвращает все самолеты, количество мест в которых больше, чем минимальное. (5 строк с самолетами с местами 2, 3, 4, 5, 5)


Expr1 OR Expr2 - объеденяет множества и получется 6 строк с самолетами с местами 1, 2, 3, 4, 5, 5

Expr1 OR Expr2 AND Expr3 - вычисляет перечение множеств (Expr1 OR Expr2) и Expr3 - получается 5 строк с самолетами с местами 2, 3, 4, 5, 5





#4