2015-09-25 123 views
0

我有一個帶有用戶的訂單和表格。用戶表中的條目可以放在一個訂單中。使用GROUP BY或DISTINCT加左連接

隨着下面的MySQL語句,我得到重複值的訂單,如果有匹配的用戶:

SELECT o.id, u.id as 'user_id', u.name 
FROM orders o 
LEFT JOIN users u ON o.user_id = u.id 
WHERE o.status = 'active' 

如果我添加一個GROUP BY o.id它解決了問題。

SELECT o.id, u.id as 'user_id' 
FROM orders o 
LEFT JOIN users u ON o.user_id = u.id 
WHERE o.status = 'active' 
GROUP BY o.id 

如果我使用SELECT DISTINCT它也適用。

我的問題是:

  1. 爲什麼它返回重複的領域?
  2. 使用GROUP BY或SELECT DISTINCT更正確嗎?
+1

GROUP BY正確 –

+0

使用group by可以得到準確的結果 –

+0

爲什麼'select distinct'會出錯或者不準確?(回覆Rahautos和Ushma Shah) –

回答

1

詳細查詢 - 查詢返回的每一行,而不是重複數據刪除的版本DISTINCT或GROUP BY - 是找到超過排在usersorders匹配的每行。所以,它忠實地返回所有這些行。

要正確解決您的問題,您需要弄清爲什麼每個訂單有多個users行。也就是說,對於order.user_id的某些值,有多個值users.id

這對我來說似乎有點奇怪,但我不明白你的數據模型。您可能需要調查此數據異常。傳統的模式會讓每個用戶能夠下多個訂單,但每個訂單隻與一個用戶有關。在這種架構上的查詢會產生一個行每個訂單,但仍然包括用戶沒有訂單:

SELECT u.id AS user_id, o.id AS order_id 
    FROM users AS u 
    LEFT JOIN orders AS o ON o.user_id = u.id 

莫非這就是你想要的嗎?

與一些人的看法相反,GROUP BY orders.idSELECT DISTINCT orders.id, users.id不是是一樣的東西。實際上,您建議使用GROUP BY誤用notorious MySQL extension to GROUP BY.標準SQL將拒絕您的GROUP BY。它只接受GROUP BY orders.id, users.id,這確實等同於DISTINCT。

0

爲什麼它返回重複的字段?

它返回重複項,因爲您沒有應用任何措施來阻止它重複。當你應用GROUP BY或DISTINCT時,你實際上停止了重複。

它是更正確使用GROUP BY或SELECT DISTINCT

兩者是等價的,可以用來按你的方便。您可能會發現DISTINCT比GROUP BY更快,因爲索引不會在您的表上創建。但是這並沒有使GROUP BY的用法不正確。如果創建了索引,那麼它們都是相互等價的。

0

您的查詢完全不需要JOIN。您可以使用:

SELECT o.id, o.user_id 
FROM orders o 
WHERE o.status = 'active'; 

至於SELECT DISTINCTGROUP BY。這兩者在性能(或非常接近)方面應該相當。他們在做基本上相同的工作。

GROUP BY的優點是您可以添加聚合函數。 DISTINCT的優點是您不必列出所有列兩次,並且它接受*

+0

謝謝你是基於我的問題中的陳述是正確的。爲了使其更具可讀性,我減少了查詢的數量,但它確實要求用戶表中的附加值。 – xylar