我正在编写一个查询,我将一组行分组,以查找其中一列的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子句似乎可以解决问题。但是,在我继续在我的应用程序中包含此查询之前,我只想知道此方法是否始终返回正确的值。这是正确的方法吗?我已经看到了一些使用子查询的例子,但是我也读过这个效率低的问题。
提前致谢。
答案 0 :(得分:4)
在分组之前添加ORDER BY子句似乎可以解决问题。但是,在我继续在我的应用程序中包含此查询之前,我只想知道此方法是否始终返回正确的值。这是正确的方法吗?我已经看到了一些使用子查询的例子,但是我也读过这个效率低的问题。
不,这不是正确的方法。
我相信你在谈论这样的问题:
SELECT product.*, MIN(qty)
FROM product
GROUP BY
type
ORDER BY
qty
您在这里使用MySQL
的扩展程序,可以在GROUP BY
查询中选择未分页/未分组的列。
这主要用于JOIN
上同时包含GROUP BY
和PRIMARY 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,它是一个事件,你想先看一个出现较少的人(意思是出现的次数减少,我猜)。
干杯,