2016-08-31 3 views
1

Я знаю, что с лимитом в конце SQL заявление, как это:Как сделать частичный LIMIT в SQL Select

SELECT * FROM books WHERE 1 LIMIT 3 

он будет показывать не более 3 пунктов из таблицы books.

Теперь представьте себе, что у нас есть поле, category и фильтр по ним:

SELECT * FROM books WHERE category IN (1, 3, 5) LIMIT 3 

я получить эти строки в категории со значениями 1, 3 или 5, и снова предел рядов 3.

Как я могу получить лимит по 3 для каждой категории? (Очертание основной идеи)

SELECT * FROM books WHERE category IN (1, 3, 5) LIMITS (3, 3, 3) 
+0

использование MySQL подзапрос – JYoThI

+1

'' LIMIT' без ORDER BY' производит неопределенные результаты. Тот же запрос, выполненный дважды по тем же данным, может возвращать разные результаты. Используйте «ORDER BY» для получения согласованных результатов. – axiac

ответ

3

Вы могли бы сделать это с UNION:

(SELECT * FROM books WHERE category = 1 LIMIT 3) 
UNION 
(SELECT * FROM books WHERE category = 3 LIMIT 3) 
UNION 
(SELECT * FROM books WHERE category = 5 LIMIT 3) 

http://dev.mysql.com/doc/refman/5.7/en/union.html

+0

Просто добавьте круглые скобки (сделайте их подзапросами) – Pred

0

Наряду с MySQL user defined variables вы можете достичь этого:

SELECT 
t.* 
FROM 
(
    SELECT 
    *, 
    IF(@sameCategory = category , @rn := @rn + 1, 
     IF(@sameCategory := category, @rn := 1, @rn := 1) 
    ) AS rowNumber 
    FROM books 
    CROSS JOIN (SELECT @sameCategory := 0, @rn := 1) var 
    ORDER BY category 
) AS t 
WHERE t.rowNumber <= 3 
ORDER BY t.category 
0

Вы надеваете 't использовать LIMIT в одном запросе. Один метод использует переменные:

select b.* 
from (select b.*, 
      (@rn := if(@c = category, @rn + 1, 
         if(@c := category, 1, 1) 
         ) 
      ) as rn 
     from books b cross join 
      (select @c := -1, @rn := 0) params 
     where category in (1, 2, 3) 
     order by category 
    ) b 
where rn <= 3; 
Смежные вопросы