获取mysql中不同类别的产品,每个id都有单独的限制

时间:2015-05-19 12:19:31

标签: mysql

我有一个名为'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

可能会更改数据顺序

3 个答案:

答案 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类中删除。

SQL Fiddle Demo

答案 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

此结果集完全符合您所声明的标准。