繁体   English   中英

MySQL LEFT JOIN有多个条件

[英]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返回:

  1. 2016 ,共享类型Anual -> 1个结果-> User_id :2
  2. 2015 ,股份类型Anual -> 0结果
  3. 年份2017 ,共享类型Anual -> 2个结果-> User_id :1和2
  4. 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM