选择多个连接表中的位置

时间:2011-09-09 05:05:23

标签: mysql

我已经解决了这个问题,只是不确定如何最好地编写这个查询。

逻辑是

  

我们的交易ID为1   交易与多个地区相关联   交易与多种利益挂钩   用户链接到多个区域
  用户链接到多个兴趣
  我们希望所有用户都在......

     

用户链接到与交易相同的区域

     

userRegionLink url,dealRegionLink drl
  url.regionId位于drl.regionId,其中drl.dealId = 1
  用户链接到与交易相同的兴趣   userInterestLink uil,dealInterestLink dil
  uil.interestId位于dil.interestId,其中dil.dealId = 1
  这会给我们一个用户列表   现在我们需要从列表中选择不同的,这样我们最终只会向每个用户发送一封电子邮件

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

我们正在处理几张表

我们有

users其中包含所有用户信息userId,其他列不重要

userInterestLink,其中包含userIdinterestId dealInterestLink dealIdinterestId

userRegionLink,其中包含userIdregionId dealRegionLink dealIdregionId

所以我们最终想要的是所有匹配的用户信息。

3 个答案:

答案 0 :(得分: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

未经测试。

答案 1 :(得分: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
)

?如果结果没问题,则可以SELECT DISTINCT u.userId FROM users u -- ...

(未经测试)

答案 2 :(得分: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`

使用虚拟数据和假定的架构在本地进行测试。工作顺利。