2011-09-09 51 views
1

我已经制定了逻辑,只是不确定如何最好地编写此查询。选择多个连接表中的哪个位置

逻辑是

我们具有1
交易ID的处理是链接到一个处理是链接到用户被链接到多个区域
多重利益
多个区域
用户链接到多个兴趣
我们希望所有用户在哪里......

用户链接到同一区域作为交易

userRegionLink URL,dealRegionLink DRL
url.regionId是在drl.regionId其中drl.dealId = 1
用户被链接到同一兴趣作为交易
userInterestLink UIL,dealInterestLink稀
uil.interestId在dil.interestId其中dil.dealId = 1
这将给我们
现在我们需要从列表中选择不同的,所以我们最终只会发送每个用户使用一个电子邮件

的用户列表

但我不知道写这个查询的最佳方法是什么。

我们在这里处理了几桌

我们有

users其在没有重要

userInterestLink具有userIdinterestId
dealInterestLinkuserId等栏目中的所有用户信息其中有dealIdinterestId

userRegionLink具有userId并且具有dealIdregionId

所以我们是想到底是所有匹配的用户信息regionId
dealRegionLink

回答

3

我拿RC的答案,并修改它

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 
) 

,因为没有必要LEFT JOIN如果我排除NULL行之后。

更多的“对称”的版本没有子查询,并与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不错(不知道'JOIN') – 2011-09-09 05:51:03

0

喜欢的东西:

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 
) 

?如果结果是OK,你就可以SELECT DISTINCT u.userId FROM users u -- ...

(未测试)

+0

用我的虚拟数据进行测试 - Works OK。 (只需要使用'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` 

本地使用虚拟数据和推测模式进行了测试。行得通。