这是一个简单的查询:
SELECT orders.id, customers.name, COUNT(order_product.id)
FROM orders
INNER JOIN order_product ON orders.id = order_product.order_id
INNER JOIN customers ON orders.customer_id = customers.id
GROUP BY orders.id;
换句话说,我想:
问题在于选择customers.name
。我不能直接选择它,因为它不是聚合函数,也不是group by。但只有一个,所以我知道为什么要聚合它。我可以这样做一个技巧来选择它的名字:
SELECT MAX(customers.name)
但我认为这很脏,因为我不想要订购客户的最大名称"但是"订单的客户名称"。 做这种事情的优雅方式是什么?
希望它清楚,不重复。
编辑 :订单只有orders.customer_id
标识的一位客户。这就是为什么我问为什么我必须做这样的伎俩。
答案 0 :(得分:1)
将customers.name添加到GROUP BY
子句:
SELECT orders.id, customers.name, COUNT(order_product.id)
FROM orders
INNER JOIN order_product ON orders.id = order_product.order_id
INNER JOIN customers ON orders.customer_id = customers.id
GROUP BY orders.id, customers.name
通常,您可以简单地按所有选定列进行分组,这些列不是设置函数的参数!
答案 1 :(得分:1)
或者,您可以使用窗口函数
SELECT DISTINCT orders.id, customers.name, COUNT(order_product.id) OVER ( PARTITION BY orders.id)
FROM orders
INNER JOIN products ON orders.id = order_product.order_id
INNER JOIN customers ON orders.customer_id = customers.id;