2017-02-21 52 views
1

下面是一個簡單的查詢:集團通過與內連接:怎麼沒有「最大」絕招選擇加入

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; 

換句話說,我想:

  • 訂單的ID 。
  • 每個訂單中的產品數量(計數)。
  • 訂單的客戶名稱。

問題是關於選擇customers.name。我不能直接選擇它,因爲它不在聚合函數中,也不在group by中。但是只有一個,所以我知道爲什麼我必須將它聚合。我可以做這樣的伎倆來選擇它的名字:

SELECT MAX(customers.name) 

但我認爲這是骯髒的,因爲我不想要了「訂單客戶的最大名稱」,而是「客戶的名稱訂單」。 做這樣的事情的優雅方式是什麼?

希望它是明確的,而不是重複。

編輯:訂單隻有一個客戶由orders.customer_id標識。這就是爲什麼我問爲什麼我必須這樣做。

+1

訂單隻有一個客戶?!? –

+0

是的。我編輯我的問題。 –

+1

而'GROUP BY orders.id,customers.name'結果不是你想要的嗎? – jarlh

回答

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

或者,你可以使用窗口功能

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;