2013-02-07 213 views
0

我做的使用MySQL 5,要求項目如下:SQL查詢重複結果

提供的用戶名,設備類型,操作系統版本和水果參與選秀權,即用戶有 相同設備類型,分別爲運行iOS 4或4.1,並且挑相同水果

相關的表如下:

用戶:{UID:INT,名稱:VARCHAR(45),deviceOS:VARCHAR(45),設備類型:VARCHAR(45)}

取貨:{UID:INT,TS:時間戳,水果:VARCHAR(45) }

(主鍵以粗體顯示。 UID在皮克是uID的用戶外鍵)

我做下面的查詢:

SELECT DISTINCT NAME1, OS1, DEV1, NAME2, OS2, DEV2, P1.fruit FROM Pick AS P1, Pick AS P2, 

(SELECT U1.uID AS User1, U1.name AS NAME1, U1.deviceOS AS OS1, U1.deviceType AS DEV1, 
     U2.uID AS User2, U2.name AS NAME2, U2.deviceOS AS OS2, U2.deviceType AS DEV2 
FROM User AS U1, User AS U2 
WHERE (U1.uID != U2.uID) AND 
     (U1.deviceType = U2.deviceType) AND 
     (U1.deviceOS = "4" OR U1.deviceOS = "4.1") AND 
     (U2.deviceOS = "4" OR U2.deviceOS = "4.1")) AS PartialResult 

WHERE (P1.uID = PartialResult.User1) AND 
     (P2.uID = PartialResult.User2) AND 
     (P1.fruit = P2.fruit) 

這將返回以下結果,但正如你看到的,它以某種方式「複製「:

我試圖解決這個使用GROUP BY水果,但它不會在一般的情況下返回正確的結果。限制1也不適用於一般情況。因此經過無數小時試圖弄清楚這一點,我必須問:

有沒有辦法在一般情況下防止這種重複?

謝謝!

回答

4

相反的U1.uID != U2.uID,寫U1.uID > U2.uID

+0

這樣一個簡單而強大的詭計!謝謝,正是我期待的! –

2

您遇到的問題是每一行都將被複制,a--bb--a。你需要某種方式來指定你只需要一個或另一個,但問題是,哪一個?您是否有偏好Priscilla是否在Marcia之前上市,反之亦然?

如果沒有偏好,那麼你可以彌補一些任意的規則將只允許一個或另一個經歷。

SELECT DISTINCT NAME1, OS1, DEV1, NAME2, OS2, DEV2, P1.fruit FROM Pick AS P1, Pick AS P2, 

(SELECT U1.uID AS User1, U1.name AS NAME1, U1.deviceOS AS OS1, U1.deviceType AS DEV1, 
     U2.uID AS User2, U2.name AS NAME2, U2.deviceOS AS OS2, U2.deviceType AS DEV2 
FROM User AS U1, User AS U2 
WHERE (U1.uID != U2.uID) AND 
     (U1.deviceType = U2.deviceType) AND 
     (U1.deviceOS = "4" OR U1.deviceOS = "4.1") AND 
     (U2.deviceOS = "4" OR U2.deviceOS = "4.1")) AS PartialResult 

WHERE (P1.uID = PartialResult.User1) AND 
     (P2.uID = PartialResult.User2) AND 
     (P1.fruit = P2.fruit) AND 
     (STRCMP(NAME1, NAME2) < 0) 

當然,你可以實現你想要的挑選一個或其他任何規則:例如,你可以在那裏的第一個名字排在最後前的第二個(見最後一行)比較名字,只搶行。 @ igelkott的答案通過強制執行人員1的uID高於人員2的uID解決了問題,這非常合理(並且比執行字符串比較更快)。

+0

你的答案也是一個很好的答案!謝謝! –