Выберите количество элементов каждого типа

#php #mysql #sql

#php #mysql #sql

Вопрос:

Итак, моя таблица SQL выглядит следующим образом:

 EVENTS
#id
*event_type
  

Я хочу выбрать 5 элементов каждого типа, не делая 5 отдельных запросов и не создавая объединение. Есть ли какой-либо метод?

Комментарии:

1. Каковы ваши ожидаемые критерии для выбора этих 5 элементов?

Ответ №1:

Чтобы ограничить результат до 5 элементов на группу, вы должны использовать предложение limit в подзапросе. Моя текущая версия MySQL не позволяет этому произойти (5.1.47) Я не уверен, поддерживается ли это в более новых версиях.

Это самое близкое, что я могу получить:

 select id, event_type from events e1
where (
    select count(*) from events e2
    where e1.event_type = e2.event_type) >= 5;
  

Это вернет идентификатор пары, event_type для всех event_types, которые имеют 5 или более идентификаторов, связанных.

Другой запрос, о котором я подумал, был тем, который я упомянул, я не мог запустить, потому что получал:

 This version of MySQL doesn't yet support 'LIMIT amp; IN/ALL/ANY/SOME subquery'
  

Я не уверен, поддерживает ли его какая-либо версия или это вводящая в заблуждение ошибка. Вот теоретический запрос:

 select id, event_type from events e1
where (
    select count(*) from events e2
    where (
    e2.id in (
        select id from events e3
        where e3.event_type = e2.event_type
        limit 5
    ) and e2.event_type = e1.event_type)
) >= 5;
  

Я почти уверен, что если бы mysql мог справиться с этим ограничением, это сработало бы.

Надеюсь, это поможет.

Комментарии:

1. Я попробую это, как только вернусь домой, действительно, старые версии MySQL имеют некоторые ограничения, но я помню, что некоторое время назад выполнял подзапрос в WHERE, и это сработало, поэтому второй пример должен быть функциональным.

Ответ №2:

попробуйте использовать агрегированные функции :

 SELECT event_type,max(id) FROM `EVENTS` GROUP BY event_type
  

Комментарии:

1. Max (id) не нужен в MySQL, просто id будет быстрее разрешаться и будет почти таким же неопределенным, 1 для ответа на вопрос.

2. Это немного отличается от ожидаемого результата, поскольку OP ожидает получить 5 идентификаторов для каждого event_type, и это приводит только к одному

Ответ №3:

Попробуйте этот:

 select id, event_type 
from EVENTS e 
where (
    select count(*) 
    from EVENTS e1 where e.event_type=e1.event_type and e1.id < e.id) < 5 
order by event_type;
  

Комментарии:

1. В чем причина понижения голосов? Я думаю, что этот код работает нормально.