У меня есть следующая таблица
Я хочу найти факультет, на котором обучается больше всего студентов, и когда это сработает, я хочу выяснить, одинаково ли количество студентов на двух факультетах. Я хочу вывести название отдела меньшего размера в алфавитном порядке.
Я попытался имитировать это решение, которое не включает дополнительный запрос: как найти максимальное значение и связанные с ним значения полей в SQL это именно то, что мне нужно, но с включенным подзапросом count.
SELECT sub.dept_name, max_dep
FROM (SELECT student.dept_name, COUNT(student.dept_name) as dep_count
FROM student GROUP BY student.dept_name) as sub
WHERE sub.max_dep = (select max(dep_count) from sub )
Это дает синтаксическую ошибку и не работает.
Я использую этот сайт, чтобы проверить свой запрос (в таблице учеников).
Я также не хочу использовать ORDER BY, а затем ограничивать ответ одной строкой. Я предпочитаю использовать предложение WHERE
для проверки максимума, но я не уверен, как этого добиться.
Это потому, что я думал, что ответ может быть получен с помощью предложения Where, я просто хочу понять разные подходы к этому вопросу.
Поскольку я тестирую его на этом веб-сайте, они поддерживают базовый SQL, но я также могу использовать MySQL
Используйте ORDER BY
, больше ничего не делайте. Остальные варианты хуже читаются, медленнее, не имеют никаких преимуществ. Понятия не имею, почему вам срочно хочется писать плохие SQL-запросы, а не хорошие. Прекрати! Если вы хотите чему-то научиться, сосредоточьтесь на сложных и значимых вопросах, а не на таких плохих идеях.
Примеры данных — это здорово. но можете ли вы также указать ожидаемый результат? Т.е. предоставьте полный минимально воспроизводимый пример .
Кстати, dbfiddle.uk отлично подходит для простых целей тестирования. Поддерживает несколько основных баз данных.
Вы можете сделать простой WHERE NOT EXISTS subquery
, чтобы избежать ЗАКАЗАТЬ ПО.
@JhonSilver Обратите внимание, что Генеративный ИИ (например, ChatGPT) запрещен , и прочитайте Справочный центр: Политика ИИ. Запрещено использовать инструменты искусственного интеллекта для создания или изменения содержания контента, который вы публикуете в Stack Overflow. Кроме того, инструменты ИИ известны тем, что пишут ерунду, и нет смысла просить людей здесь отлаживать неработающий код, написанный ИИ.
См. пример
select min(dept_name) dept_name,cnt
from (
select dept_name,count(*) cnt
from student
group by dept_name
having count(*)
=(select max(cnt)
from(
select count(*) cnt
from student group by dept_name
)as counts
)
)max_depts
group by cnt
Рассмотрим запрос по частям.
select dept_name,count(*) cnt
from student
group by dept_name
Выход:
(select max(cnt)
from(
select count(*) cnt
from student group by dept_name
)as counts
)
Результат подзапроса counts
: (cnt)(3),(1),(1),(1),(3).
Затем выберите max(cnt) из counts
, результат (3).
HAVING
для фильтрации этого вывода (подзапрос max_depts
)select dept_name,count(*) cnt
from student
group by dept_name
having count(*)
=(... ->3 )
max_depts
может иметь 1 или несколько строк, где cnt
то же самое.min(dept_name)
и группируем по cnt
.select min(dept_name) dept_name,cnt
from ( ... )max_depts
group by cnt
Другой пример
select min(dept_name) dept_name,cnt
from (
select dept_name,count(*) cnt
from student
group by dept_name
)as depts_counts
where cnt=(select max(cnt)
from(
select count(*) cnt
from student group by dept_name
)as counts
)
group by cnt
Там
1.Посчитайте количество студентов на каждом факультете.
2. Фильтровать по состоянию cnt=3
. Фильтр применяется перед группировкой.
3. Сгруппируйте по cnt
Попробуйте Скрипка
Если вы не хотите использовать
ORDER BY
, вам следует указать причину, потому что именно так можно это сделать.