#mysql
Вопрос:
У меня есть следующая таблица сообщений:
------------------- | name | type | --------- --------- | admin-1 | type1 | | user-1 | type1 | -------------------
Я хочу сгруппировать записи по типу и вернуть их, если в группе более 1 элемента, а затем отфильтровать этот результат по имени.
Это запрос, который был опробован:
select count(*), type from posts where name like 'admin-%' group by type having count(*) gt; 1
Однако в моем запросе where
выполняется предложение «до» group by
, поэтому я не получаю type1
свой результирующий набор.
Как я мог бы достичь того, чего я хочу ?
Спасибо
Комментарии:
1. Опустите «где»
2. Я не понимаю вашего комментария. Куда же мне тогда девать это «куда»?
Ответ №1:
Попробуйте вложенные запросы
SELECT * FROM posts WHERE type IN ( SELECT type FROM posts GROUP BY type HAVING COUNT(*) gt; 1 ) AND name LIKE 'admin-%'
Комментарии:
1. Это имеет смысл, но разве это невозможно сделать с помощью одного выбора ?
2. @sroup нет, я не думаю, что вы можете сделать это без вложенных запросов
Ответ №2:
Вы можете сделать это с помощью EXISTS
:
select p.* from posts p where p.name like 'admin-%' and exists (select 1 from posts where type = p.type and name lt;gt; p.name)
Если вы ожидаете, что в результатах будет только 1 строка для каждого типа, это можно сделать с помощью условной агрегации:
select type, max(case when name like 'admin-%' then name end) name from posts group by type having count(*) gt; 1 and sum(name like 'admin-%') gt; 0