![](/img/trans.png)
[英]Select The last 3 news from each category - Two tables - (MySQL - PHP)
[英]Select 2 products from each category in MySQL
非常類似於MYSQL - 為表格中的每個類別選擇前4條記錄,但沒有接受的答案,那里的答案沒有多大意義,所以我再次提問。
我有一個包含3列的PRODUCTS
表: ID
, NAME
和CATEGORY
我現在想知道的是,如果可以為每個不同的類別選擇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.