2010-10-29 52 views
3

我正在寫一個查詢,我將選擇的行分組,以查找其中一列的MIN值。將一個有序的表分組總是返回第一行嗎? MYSQL

我還想返回與返回的MIN行相關聯的其他列值。

ID QTY PRODUCT TYPE 
-------------------- 
1 2 Orange Fruit 
2 4 Banana Fruit 
3 3 Apple Fruit 

如果我GROUP這個表由列「類型」,選擇最小數量,它不會返回相應產品的MIN行已在上述情況下是「蘋果」 。

在分組之前添加ORDER BY子句似乎可以解決問題。但是,在我繼續前進並在我的應用程序中包含此查詢之前,我只想知道此方法是否總能返回正確的值。這是正確的方法嗎?我已經看到了一些使用子查詢的例子,但是我也讀過這個效率低下的例子。

在此先感謝。

回答

4

在分組之前添加ORDER BY子句似乎可以解決問題。但是,在我繼續前進並在我的應用程序中包含此查詢之前,我只想知道此方法是否總能返回正確的值。這是正確的方法嗎?我已經看到了一些使用子查詢的例子,但是我也讀過這個效率低下的例子。

不,這不是正確的做法。

我相信你是在談論這樣的查詢:

SELECT product.*, MIN(qty) 
FROM product 
GROUP BY 
     type 
ORDER BY 
     qty 

你在做什麼在這裏使用MySQL的擴展,它允許你在一個GROUP BY查詢選擇非聚集/解組列。

這既包含JOIN並在PRIMARY KEY一個GROUP BY,像這樣的查詢主要用於:

SELECT order.id, order.customer, SUM(price) 
FROM order 
JOIN orderline 
ON  orderline.order_id = order.id 
GROUP BY 
     order.id 

這裏,order.customer既不組合也不彙總,但因爲你是分組上order.id,它保證在每個組內具有相同的值。

就你而言,qty的所有值在組內都有不同的值。

無法保證引擎將從哪個記錄中獲取該值。

你應該這樣做:

SELECT p.* 
FROM (
     SELECT DISTINCT type 
     FROM product p 
     ) pd 
JOIN p 
ON  p.id = 
     (
     SELECT pi.id 
     FROM product pi 
     WHERE pi.type = pd.type 
     ORDER BY 
       type, qty, id 
     LIMIT 1 
     ) 

如果您創建product (type, qty, id)索引,這個查詢將工作速度快。

+0

謝謝!這是一個非常豐富的答案,並且查詢效果很好。 – poleposters 2010-10-29 10:03:17

0

沒有您嘗試查詢的示例,很難正確地關注您。 從你的意見,我想你查詢類似,

SELECT ID, COUNT(*) AS QTY, PRODUCT_TYPE 
    FROM PRODUCTS 
    GROUP BY PRODUCT_TYPE 
    ORDER BY COUNT(*) DESC; 

我的建議,你按的概念(在這種情況下PRODUCT_TYPE),並通過你出現計數次數(*)命令。上面的查詢會做你想要的。 子查詢主要用於排序或解散不感興趣的行。

MIN你看起來不完全是一個MIN,它是一個事件,你希望首先看到出現次數較少(意思是出現次數較少,我猜)。

乾杯,

相關問題