[英]MySQL LEFT JOIN with multiple conditions
我试图创建一个必须从表返回值的查询Share_users_types
不存在于表Shares
根据一定的条件。
Share_types table
----------------
ID | Description
1 'Anual'
2 'Monthly'
Share_users_types table
-----------------------------
ID | user_id | share_type_id
1 1 1
2 1 2
3 2 1
Shares table
--------------------------------------------
ID | user_id | share_type_id | Year | Month
1 1 1 2015 null
2 1 2 2015 05
3 1 1 2016 null
4 2 1 2015 null
如果我在查询中设置以下条件,则它应从表Share_users_type
返回:
2016
,共享类型Anual
-> 1个结果-> User_id
:2 2015
,股份类型Anual
-> 0结果 2017
,共享类型Anual
-> 2个结果-> User_id
:1和2 2017
,月06,共享类型Monthly
-> 1个结果-> User_id
:1 如此说,我已经尝试了以下查询,但均未成功:
SELECT sharetype.user_id
FROM share_users_types AS sharetype
LEFT JOIN shares AS share ON share.user_id = sharetype.user_id
WHERE share.user_id IS NULL AND
share.year != '2016' AND share_type_id = 1
SELECT sharetype.user_id
FROM share_users_types AS sharetype
LEFT JOIN shares AS share ON share.user_id = sharetype.user_id
WHERE share.year = '2016' AND share_type_id = 1
不使用
SELECT sharetype.user_id
FROM share_users_types AS sharetype
where sharetype.user_id not in (select user_id from share where share.year != '2016' AND share_type_id = 1);
获得2015年-1016年的结果相对容易。 首先,您需要创建一个user_id-share_type_id和year值的笛卡尔联接,并在此结果集中保留联接共享表:
select distinct sut.user_id, sut.share_type_id, s.year
from (Share_users_types sut
join shares s)
left join shares s2
on sut.user_id=s2.user_id and sut.share_type_id=s2.share_type and s.year=s2.year and s2.year is null
问题是如果您将2017年或任何其他年份添加到组合中,而份额表中不存在。 Mysql本身无法选择不存在的值。
您需要创建日历表,或者使用一系列联合来列出所有年份,并将其与Share_users_types表结合。
请参阅此SO主题以获取有关此方面的指导。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.