2017-02-27 65 views
0

我試圖找出如何從一個MySQL查詢得到每個類別的只有一個結果。集團按類別在MYSQL

我們有很多產品在多個類別和目標是讓每個類別保存最大的產品,但也排除幾類的項目。這應該產生一個簡單的十大儲蓄清單。該查詢的SQL我至今是:

SELECT 
    productName, 
    productCategoryID, 
    ((maxprice/minprice-1)*100) as PercentChange 
FROM products WHERE updatedDate > DATE_ADD(NOW(), INTERVAL -1 DAY) 
    AND productCategoryID NOT IN (0,58,12,13) 
    AND (maxprice/minprice-1)*100) < '60' 
ORDER BY PercentChange DESC LIMIT 10 

查詢給我的前10項產品名單沒有某些類別,但幾個類別包含的是重複的。

任何指針?

感謝,

裏克

+1

可能的複製[選擇每個GROUP BY組第一排?](HTTP://計算器。com/questions/3800551/select-first-in-each-group-by-group) – Johan

回答

-1

假設你想每個類別的「頂」的產品,你就需要組類別和使用聚合(在這種情況下最大)。

請注意,即使mysql允許將「未聚合」列與聚合類似,但結果可能不是唯一的(例如,由於在productName上缺少聚合/分組,因此MSSQL不允許這樣的查詢) :

SELECT 
    productName, -- unaggregated -> undetermined. 
    productCategoryID, -- grouping-condition -> fine 
    MAX((maxprice/minprice-1)*100) as PercentChange -- Aggregation -> fine 
FROM products WHERE updatedDate > DATE_ADD(NOW(), INTERVAL -1 DAY) 
    AND productCategoryID NOT IN (0,58,12,13) 
    AND (maxprice/minprice-1)*100) < '60' 
GROUP BY productCategoryID 
ORDER BY PercentChange DESC LIMIT 10 

鑑於數據(簡化的)

productName | productCategoryID | PercentChange 
A    1     50 
B    1     10 
C    2     40 
D    2     40 

productCategoryIDPercentChange是可靠的。

結果可能是

A | 1 | 50 
C | 2 | 40 

,但由於對productName缺少的聚合以下結果也可能是可行的:

A | 1 | 50 
D | 2 | 40 

將producte每個類別的一個條目,但如果兩個行與其「分組」相同,但最終的結果不是100%可預測的,因此應該採取另一種方法。

你可以 - 例如 - 按名稱組爲好,然後以編程方式過濾掉不想要的結果:

SELECT 
    productName, -- grouping-condition -> fine 
    productCategoryID, -- grouping-condition -> fine 
    MAX((maxprice/minprice-1)*100) as PercentChange -- Aggregation -> fine 
FROM products WHERE updatedDate > DATE_ADD(NOW(), INTERVAL -1 DAY) 
    AND productCategoryID NOT IN (0,58,12,13) 
    AND (maxprice/minprice-1)*100) < '60' 
GROUP BY productName, productCategoryID 
ORDER BY PercentChange DESC LIMIT 10 

會導致

A | 1 | 50 
C | 2 | 40 
D | 2 | 40 

相比於「非分組」查詢這至少會消除不匹配MAX(PercentChange)(按名稱和類別)的每個條目。

PS:如果你想在最低價格的變化,使用MIN()明顯。的

0

你可以使用不同的避免重複

SELECT DISTINCT 
     productName 
     ,productCategoryID 
     ,((maxprice/minprice-1)*100) as PercentChange 
    FROM products 
    WHERE updatedDate > DATE_ADD(NOW(), INTERVAL -1 DAY) 
     AND productCategoryID NOT IN (0,58,12,13) 
     AND (maxprice/minprice-1)*100)<'60' 
    ORDER BY PercentChange DESC LIMIT 10 
+0

我認爲'productName'已經在查詢中不同了。 OP似乎希望「每類最多1個產品」。 @Rick Evans? – dognose

+0

沒有一組可以存在一些重複可以存在,但你的建議是有趣的,讓我們來看看OP是否給我們一個明確的例子 – scaisEdge

+0

實際上是獨特的是行..但如果你可以更好地解釋添加一個樣本我可以嘗試改進我的答案 – scaisEdge