#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. В чем причина понижения голосов? Я думаю, что этот код работает нормально.