簡體   English   中英

從MySQL中的每個類別中選擇2個產品

[英]Select 2 products from each category in MySQL

非常類似於MYSQL - 為表格中的每個類別選擇前4條記錄,但沒有接受的答案,那里的答案沒有多大意義,所以我再次提問。

我有一個包含3列的PRODUCTS表: IDNAMECATEGORY我現在想知道的是,如果可以為每個不同的類別選擇2個產品,而不在PHP循環中進行查詢。

所選產品的順序並不重要,它們也可能是隨機的。 但重要的是我每個類別最多只能有2個產品。

所以一個好的結果集將是

ID  ; NAME   ; CATEGORY
:::::::::::::::::::::::
152 ; APPLE  ; FRUIT
185 ; ORANGE ; FRUIT
145 ; BEEF   ; MEAT
141 ; PORK   ; MEAT
410 ; PEPSI  ; DRINKS
585 ; CARROT ; VEGETABLES
585 ; TOMATO ; VEGETABLES

沿着這些方向的東西將起作用:

SELECT id, name, category 
FROM (
  SELECT *, 
         IF( @prev <> category, 
             @rownum := 1, 
             @rownum := @rownum+1 
         ) AS rank, 
         @prev := category, 
         @rownum  
  FROM (
    SELECT * FROM products 
    ORDER BY category, rand()
  ) random_prodcts
) products_ranked 
WHERE rank <= 2;

它在類別中隨機命令它們,然后將它們拉出來跟蹤每個類別中的數量。

不知道它會如何很好地擴展。

編輯:嘗試了幾千條記錄,似乎沒問題。

這應該做你想要的。

SET @I=0; 
SET @C='';
SELECT ID, Name, Category FROM (
    SELECT B.*, 
    IF(@C != B.Category, @I:=1, @I:=@I+1) AS RowNum,
    @C:=B.Category
    FROM (
        SELECT ID, Name, Category FROM Products GROUP BY Name, Category ORDER BY Category
    ) AS B HAVING RowNum <= 2
) AS A

全SQL:

SELECT t.id, t.name, t.category
FROM the_table AS t
, (SELECT MIN(id) AS id_min FROM the_table GROUP BY category) AS t1
, (SELECT MAX(id) AS id_max FROM the_table GROUP BY category) AS t2
WHERE (t.id=t1.id_min) OR  (t.id=t2.id_max)

查詢選擇每個類別的最小值和最大值並返回它們(如果它們相同則只返回一個)。

你說“所選產品的順序並不重要,它們也可能是隨機的”,所以這種方法應該沒問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM