Как в запросе SQL отфильтровать с ограничением по количеству?

В общем суть задачи такова:
Есть таблица в которой есть поле name с различными значениями, нужно чтобы в результирующую выборку попало 5 строк у которых name=masha и 3 строки где name=dasha. Все это нужно сделать одним SELECT, без всяких UNION. Как это можно сделать никак не соображу, то ли фильтрацией, то ли сортировкой.
  • Вопрос задан
  • 2683 просмотра
Решения вопроса 1
Vakiliy
@Vakiliy
Можно так, например
SELECT a1.id, a1.name  
FROM users AS a1 LEFT JOIN users AS a2 
ON a1.name = a2.name AND a1.id <= a2.id 
GROUP BY a1.id, a1.name 
HAVING 
   (a1.name = 'dasha' AND COUNT(*) <=3) 
OR 
   (a1.name = 'masha' AND COUNT(*) <=5) 
ORDER BY a1.name;

(EXPLAIN (analyze) without indexs, total runtime: 46.380 ms)

или так
SELECT * FROM (
  SELECT a1.id, a1.name, count(*) AS n 
  FROM users AS a1 LEFT JOIN users AS a2 
  ON a1.name = a2.name AND a1.id <= a2.id GROUP BY a1.id, a1.name
) AS t 
WHERE (t.name = 'dasha-1' and t.n <= 3) OR (t.name = 'dasha-2' and t.n <= 5) 
ORDER BY t.name;

(EXPLAIN (analyze) without indexes, total runtime: 38.711 ms)

(SELECT ...) UNION (...)
(EXPLAIN (analyze) without indexes, total runtime: 1.546 ms)
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
taliban
@taliban
php программист
А чем собственно юнион не угодил?
Ответ написан
Комментировать
@H1ghlander Автор вопроса
Ясно, идея не увенчалась успехом. Спасибо откликнувшимся.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы