将有序表分组总是返回第一行吗? MYSQL

时间:2010-10-29 09:43:49

标签: mysql

我正在编写一个查询,我将一组行分组,以查找其中一列的MIN值。

我还想返回与返回的MIN行关联的其他列值。

e.g

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

如果我通过列'TYPE'对此表进行分组并选择MIN数量,它将不会返回MIN行的相应产品,在上面的例子中是'Apple'。

在分组之前添加ORDER BY子句似乎可以解决问题。但是,在我继续在我的应用程序中包含此查询之前,我只想知道此方法是否始终返回正确的值。这是正确的方法吗?我已经看到了一些使用子查询的例子,但是我也读过这个效率低的问题。

提前致谢。

2 个答案:

答案 0 :(得分:4)

  

在分组之前添加ORDER BY子句似乎可以解决问题。但是,在我继续在我的应用程序中包含此查询之前,我只想知道此方法是否始终返回正确的值。这是正确的方法吗?我已经看到了一些使用子查询的例子,但是我也读过这个效率低的问题。

不,这不是正确的方法。

我相信你在谈论这样的问题:

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

您在这里使用MySQL的扩展程序,可以在GROUP BY查询中选择未分页/未分组的列。

这主要用于JOIN上同时包含GROUP BYPRIMARY KEY的查询,如下所示:

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)上创建索引,则此查询可以快速运行。

答案 1 :(得分:0)

如果没有您尝试的查询示例,很难正确地关注您。 根据您的评论,我猜您会查询类似的内容,

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

我的建议是,您按概念分组(在本例中为PRODUCT_TYPE),并按照它出现的次数(*)进行排序。上面的查询可以做你想要的。 子查询主要用于排序或解除不感兴趣的行。

你看的MIN不是一个MIN,它是一个事件,你想先看一个出现较少的人(意思是出现的次数减少,我猜)。

干杯,