2017-06-22 84 views
1

給定類別名稱,我可以選擇所需的條目數。 例如 - SELECT * FROM products WHERE Category = Taxi LIMIT 1, 2。 這完全給了我2分類='出租車'的條目。MySQL LIMIT多個類別

現在,給定一個類別名稱數組,我需要執行一個類似的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 | 
+----------+----------+------+ 

行的次序無關緊要。

+1

實現這一點的最簡單方法是組合幾個單獨SELECT語句的結果的UNION。 – CBroe

+1

@CBroe,但不會使它成爲一個錯誤的查詢?在類別數組中有100個元素的情況下,UNION會顯着降低處理速度。 –

+0

你到底想要在這裏實現什麼?你在這裏使用了「分頁」這個詞,但是到目前爲止,我看不出與它有多大關係。分頁甚至沒有什麼意義,除非您先指定訂單。 – CBroe

回答

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 

希望這有助於。

+0

它不是標準的SQL,你不能檢查子查詢返回結果<= 2 –

+0

這是比較而不是檢查.... –

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; 

僅限於第一2項:

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

但是你們中沒有人會將輸出限制爲只有2行。 –

+0

您可以在第二個逗號後刪除內容group_concat –

+0

選擇類別,SUBSTRING_INDEX(group_concat(items),',',2) FROM產品 group by p.category; –

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的將完成您的要求。

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) 

更有針對性的幫助,請參閱:Why should I provide an MCVE for what seems to me to be a very simple SQL query?