Mysql: где после того, как

#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