2010-10-29 49 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,它是一个事件,你希望首先看到出现次数较少(意思是出现次数较少,我猜)。

干杯,

相关问题