2011-09-09 4 views
1

私はこのロジックを使い果たしました。複数の結合テーブルのどこにあるかを選択

ロジックは

は、我々が取引を取引は、ユーザが複数の領域
にリンクされている複数の利害
にリンクされている複数の領域
にリンクされている1
の取引IDを持っていますユーザーは複数の関心にリンクされています
すべてのユーザーが必要です....

ユーザーは取引と同じ地域にリンクされています

userRegionLinkのURL、dealRegionLink DRL
url.regionIdはdrl.dealId = 1人の
ユーザが取引
userInterestLinkのUIL、dealInterestLinkのDIL
uil.interestId同じ関心に連結さdrl.regionIdでありますdil.dealId = 1
が、これは私たちに、ユーザー
のリストを与えるだろうdil.interestIdに今我々は唯一

各ユーザーに単一の電子メールを送信してしまうので、リストから明確な選択する必要がありますされ

しかし、私はこのクエリを書くための最良の方法は何であるか分かりません。

我々はuserIdinterestId
dealInterestLinkを持って

userInterestLink重要ではない、それuserIdや他の列内のすべてのユーザー情報を持っている

usersを持って

ここにいくつかのテーブルを扱っていますdealIdinterestId

dealIdと一致するすべてのユーザー情報があるので、私たちが最後に欠けている

regionIdを持ってregionId
dealRegionLinkを持って

userRegionLink

SELECT u.userId, uil.interestId, url.regionId FROM users u 
    LEFT JOIN userInterestLink uil ON (uil.userId = u.userId) 
    LEFT JOIN userRegionLink url ON (url.userId = u.userId) 
WHERE uil.interestId IS NOT NULL AND uil.interestId IN (
    SELECT DISTINCT interestId FROM dealInterestLink WHERE dealId = 1 
) AND url.regionId IS NOT NULL AND url.regionId IN (
    SELECT DISTINCT regionId FROM dealRegionLink WHERE dealId = 1 
) 

:よう

答えて

3

私は、RCの答えを取ることができ、私はその後NULL行を除外した場合LEFT JOINの必要がないよう

SELECT u.userId, uil.interestId, url.regionId FROM users u 
    JOIN userInterestLink uil ON (uil.userId = u.userId) 
    JOIN userRegionLink url ON (url.userId = u.userId) 
WHERE interestId IN (
    SELECT DISTINCT interestId FROM dealInterestLink WHERE dealId = 1 
) AND regionId IN (
    SELECT DISTINCT regionId FROM dealRegionLink WHERE dealId = 1 
) 

にそれを修正します。

より「対称」バージョンサブクエリ無しとUSINGとも

SELECT u.userId, uil.interestId, url.regionId FROM users u 
    JOIN userInterestLink uil USING (userId) 
    JOIN userRegionLink url USING (userId) 
    JOIN dealInterestLink dil USING (interestId) 
    JOIN dealRegionLink drl USING (regionId, dealId) 
WHERE dealId = 1 

未テストであろう。

+0

私のダミーデータを使ってテストしました。うまく働いた。 –

+0

+1 nice( 'JOIN'は認識していませんでした) –

0

何か?結果がOKであれば、あなたはその後、SELECT DISTINCT u.userId FROM users u -- ...

(テストしていません)

+0

私のダミーデータでこれをテストしました - OKです。 (ユーザーごとに1行を返すためには、 'DISTINCT'または' GROUP BY'を使うだけです) –

0
SELECT `u`.* 
    FROM `users` AS `u` 
    JOIN `userRegionLink` `userReg` USING (`userId`) 
    JOIN `userInterestLink` `userInt` USING (`userId`) 
    JOIN `dealInterestLink` `dealInt` USING (`interestId`) 
    JOIN `dealRegionLink` `dealReg` USING (`regionId`) 
    JOIN `deal` `d` ON (`dealInt`.`dealId` && `dealReg`.`dealId` && `d`.`dealId` = 1) 
GROUP BY `u`.`userId` 

ダミーデータと推定スキーマを使用してローカルでテストされています。うまく働いた。

関連する問題