如何在 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)
您没有在单个查询中使用 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;
我知道在 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)
您没有在单个查询中使用 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;