2

2 つのテーブルがClientsありContacts(以下を参照)、最後に追加された連絡先のみを含むすべてのクライアントを取得したいと考えていました。

この解決策に出くわすまで、結合された連絡先で使用できなかったため、サブクエリの使用をほとんど検討していましたがLIMIT 1、これは非常に単純なようです。

問題は、それが何をしているのかよくわからないことです。WHERE句の背後にある論理も私を超えています。

これに対する副次的な質問: 2 つの結合はサブクエリよりも高速ですか?

PS: MySQL を使用しています。

ありがとう。

SELECT
    cl.clientId as clientId,
    cl.clientName as clientName,
    c1.firstName as firstName,
    c1.lastName as lastName,
    c1.added as added
FROM Clients as cl
LEFT JOIN Contacts as c1 ON cl.clientId = c1.clientId
LEFT JOIN Contacts as c2 ON cl.clientId = c2.clientId AND c1.added < c2.added
WHERE c2.added IS NULL

クライアント

-----------------------------
 clientId     clientName
-----------------------------
    1          Johnny's
    2          Bonnie's

連絡先

-------------------------------------------------------
 clientId     firstName     lastName        added
-------------------------------------------------------
    1          Johnny        Simmons      2013-06-17
    1          Jane          Simmons      2013-06-18
    2          Bonnie        Hall         2013-06-19

結果

----------------------------------------------------------------------
 clientId     clientName     firstName     lastName        added
----------------------------------------------------------------------
    1          Johnny's       Jane          Simmons      2013-06-18
    2          Bonnie's       Bonnie        Hall         2013-06-19
4

2 に答える 2

4
LEFT JOIN Contacts as c2 ON cl.clientId = c2.clientId AND c1.added < c2.added
WHERE c2.added IS NULL

このwhere句は次のように述べていContactsますcl.clientId = c2.clientId AND c1.added < c2.added。これにより、以前に追加された別の連絡先が存在するすべての連絡先が除外されます。

そのため、顧客ごとに最新の連絡先が得られます。

于 2013-06-19T19:21:21.743 に答える