0

MySQL5を使用してプロジェクトを実行しています。要件は次のとおりです。

ユーザーが同じデバイスタイプを持ち、iOS 4または4.1を実行していて、同じフルーツを選んだ場合に、ピックに関係するユーザー名、デバイスタイプ、OSバージョン、およびフルーツを提供します

関連する表は次のとおりです。

ユーザー:{ uID:INT、名前:VARCHAR(45)、deviceOS:VARCHAR(45)、deviceType:VARCHAR(45)}

ピック:{ uID:INT、ts:TIMESTAMP、フルーツ:VARCHAR(45)}

(太字の主キー。PickのuIDは、Userの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

2 に答える 2

4

の代わりにU1.uID != U2.uID、を記述しU1.uID > U2.uIDます。

于 2013-02-07T21:00:38.567 に答える
2

発生している問題は、すべての行が複製されることa--bですb--a。どちらか一方だけが必要であることを指定する方法が必要ですが、問題はどちらかです。PriscillaがMarciaの前にリストされているか、またはその逆であるかを好みますか?

好みがない場合は、どちらか一方だけが通過できるようにする任意のルールを作成できます。たとえば、名前を比較して、名が辞書式順序で2番目の名前の前にある行のみを取得できます(最後の行を参照)。

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の答えは、人1uIDを人2よりも高くするように強制することで同じ方法で問題を解決しますuID。これは、非常に合理的です(文字列比較を行うよりも高速です)。

于 2013-02-07T20:58:39.950 に答える