我尝试根据某些条件创建一个必须返回表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
答案 0 :(得分: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);
答案 1 :(得分:0)
获得2015 - 1016的结果相对容易。首先,您需要在此结果集上创建user_id - share_type_id和year值以及左连接共享表的carthesian连接:
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表结合使用。
有关此问题的指导,请参阅this SO topic。