MySQL限制多个类别

时间:2017-06-22 08:27:03

标签: mysql sql database limit

根据类别名称,我可以选择所需的条目数。 例如 - SELECT * FROM products WHERE Category = Taxi LIMIT 1, 2。 这完美地给了我2个Category ='Taxi'的条目。

现在,给定一个类别名称数组,我需要执行类似的SQL查询,在那里我将能够获取每个类别所需的条目数。

要求 - 我需要在['Taxi','Groceries','Delivery'中获取每个类别的2(LIMIT 1,2)行的所有数据。 。 。 。 。 。 。 。 。 。 。 ] ,使用单个SQL查询。可能吗?如果是,请回答。

我试过这个 - SELECT * FROM products WHERE Category IN ('Taxi', 'Groceries', 'Delivery', . . . . . . . . . . . ) LIMIT 1, 2,但它给出了与上面相同的结果。

这就是产品表的样子 -

+----------+----------+------+
| Category | Items    | Count|
+----------+----------+------+
| Taxi     | Sedan    | 32   |
| Delivery | Food     | 34   |
| Delivery | Package  | 42   |
| Meals    | Sandwitch| 29   |
| Groceries| Butter   | 36   |
| Taxi     | SUV      | 39   |
| Groceries| Milk     | 39   |
+----------+----------+------+

预期的O / P -

+----------+----------+------+
| Category | Items    | Count|
+----------+----------+------+
| Taxi     | Sedan    | 32   |
| Delivery | Food     | 34   |
| Delivery | Package  | 42   |
| Groceries| Butter   | 36   |
| Taxi     | SUV      | 39   |
| Groceries| Milk     | 39   |
+----------+----------+------+

行顺序并不重要。

4 个答案:

答案 0 :(得分:0)

你可以试试这个 -

SELECT p.category, p.items, p.count(*) num 
FROM product AS p 
WHERE (SELECT COUNT(*) FROM product AS p2 
       WHERE p2.category = p.category AND p2.items >= p.items) <= 2 
ORDER BY p.category ASC, p.items DESC

希望这有帮助。

答案 1 :(得分:0)

group_concat可能是你的朋友。试试看:它会显示与某个类别相关的所有项目,最常见的项目应首先出现

select category, group_concat(items) from 
FROM product 
group by p.category;

select category, group_concat(items) from 
(SELECT p.category, p.items, p.count(*) as nb 
FROM product AS p 
group by p.category, p.items) as viewcats;

仅限前两项:

select category, SUBSTRING_INDEX(group_concat(items),',',2) from FROM product group by p.category; 

答案 2 :(得分:0)

如果没有window functions,这将变得非常难看。 MySql目前不支持窗口功能,但MariaDb支持。为什么不转换为MariaDb,这将使这样的事情变得如此简单。只要您没有使用Json功能或其他东西,它就是MySql的替代品。像谷歌和维基百科这样的大多数公司已经取得了成功。我会检查一下。这是您可以执行的示例查询:

SELECT category, item, itemcount as count FROM
(
     SELECT category,
          item,
          ROW_NUMBER() OVER (PARTITION BY category ORDER BY item) AS row_number,
          COUNT(*) OVER (PARTITION BY category, item ORDER BY item) as itemcount
     FROM products p
) a
WHERE a.row_number < 3

mariadb中的此查询(未经测试)将满足您的要求。

答案 3 :(得分:0)

请注意,为妥善解决问题的具体细节而导致的任何失败仅仅反映了问题本身固有的缺乏......

DROP TABLE IF EXISTS my_table;

CREATE TABLE my_table
(Category VARCHAR(12) NOT NULL
,Items    VARCHAR(12) NOT NULL PRIMARY KEY
,Count INT NOT NULL
);

INSERT INTO my_table VALUES
('Taxi','Sedan',32),
('Delivery' ,'Food'     ,34),
('Delivery' ,'Package'  ,42),
('Meals'    ,'Sandwitch',29),
('Groceries','Butter'   ,36),
('Taxi'     ,'SUV'      ,39),
('Groceries','Milk'     ,39);

SELECT * 
  FROM my_table 
 WHERE category IN ('taxi','groceries','delivery');
+-----------+---------+-------+
| Category  | Items   | Count |
+-----------+---------+-------+
| Taxi      | Sedan   |    32 |
| Delivery  | Food    |    34 |
| Delivery  | Package |    42 |
| Groceries | Butter  |    36 |
| Taxi      | SUV     |    39 |
| Groceries | Milk    |    39 |
+-----------+---------+-------+
6 rows in set (0.01 sec)

有关更具针对性的帮助,请参阅:Results