MySQL LEFT JOIN具有多个条件

时间:2016-04-18 08:48:05

标签: mysql

我尝试根据某些条件创建一个必须返回表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
  5. 有了这个说我试过以下的查询没有成功:

    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
    

2 个答案:

答案 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