我有一个名为'Product'的表,就像这样
id | Category_id | ProductName | Quantity
...........................................
1 | 2 | ABC | 4
2 | 2 | DEF | 2
3 | 2 | GHI | 4
4 | 2 | JKL | 1
5 | 2 | MNO | 4
6 | 2 | PQR | 4
7 | 2 | STU | 4
8 | 3 | VWX | 4
9 | 3 | YZA | 4
10 | 3 | YAB | 4
11 | 3 | YCD | 4
12 | 4 | YEF | 4
13 | 5 | YGH | 4
我想以限制5获取Category_id 2和3的产品。 注意:应用限制后,必须显示每个类别的产品。 预期输出:从每个Category_id 2和3
获取包含随机数据的总共五行输出
id | Category_id | ProductName | Quantity
...........................................
5 | 2 | MNO | 4
6 | 2 | PQR | 4
7 | 2 | STU | 4
8 | 3 | VWX | 4
9 | 3 | YZA | 4
可能会更改数据顺序
答案 0 :(得分:2)
您可以使用变量:
SELECT id, Quantity, ProductName, Category_id
FROM (
SELECT id, Quantity, ProductName, Category_id,
@row_number:= CASE
WHEN @cid = Category_id THEN @row_number+1
ELSE 1
END AS row_number,
@cid:=Category_id
FROM (
SELECT id, Quantity, ProductName, Category_id
FROM products
WHERE Category_id IN (2, 3)
ORDER BY Category_id, RAND() ) s ) t
ORDER BY row_number, Category_id
LIMIT 5
以上查询将从类别2,3中选择总共5条记录,尝试平衡从每个类别中提取的记录数:将从类别2中提取3条记录,而2条记录将从第3类中删除。
答案 1 :(得分:0)
一种方法是分别获取两个查询并使用UNION ALL
(
select *
from Product
where `Category_id ` = 2
order by ProductName desc
LIMIT 5
)
UNION ALL
(
select *
from Product
where `Category_id ` = 3
order by ProductName desc
LIMIT 5
)
答案 2 :(得分:0)
为什么不呢
7 | 2 | STU | 4
8 | 3 | VWX | 4
9 | 3 | YZA | 4
10 | 3 | YAB | 4
11 | 3 | YCD | 4
此结果集完全符合您所声明的标准。