如何在 SQL Select 中设置部分 LIMIT

How to make a partial LIMIT in a SQL Select

我知道在 SQL 语句末尾有一个 LIMIT,像这样:

 SELECT * FROM books WHERE 1 LIMIT 3

最多显示 table books 中的 3 个项目。

现在假设我们有一个字段 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)

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

你可以用 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

您没有在单个查询中使用 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;