我已经解决了这个问题,只是不确定如何最好地编写这个查询。
逻辑是
我们的交易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
,其中包含userId
和interestId
dealInterestLink
dealId
和interestId
userRegionLink
,其中包含userId
和regionId
dealRegionLink
dealId
和regionId
所以我们最终想要的是所有匹配的用户信息。
答案 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`
使用虚拟数据和假定的架构在本地进行测试。工作顺利。