2016-04-18 25 views
0

Ich versuche, eine Abfrage erstellen, die die Werte aus der Tabelle Share_users_types, die nicht in Tabelle Shares unter bestimmten Bedingungen vorhanden sind, zurückgeben muss.MySQL LEFT JOIN mit mehreren Bedingungen

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 

Wenn ich die folgenden Bedingungen in meiner Anfrage eingestellt, sollte es aus der Tabelle zurückkehren Share_users_type:

  1. Jahr 2016, Share Typ Anual -> 1 Ergebnisse ->User_id: 2
  2. Jahr 2015, Teilenummer Anual -> 0 Ergebnisse
  3. Jahr 2017, Teilenummer Anual -> 2 ergebnisse ->User_id: 1 und 2
  4. Jahr 2017, Monat 06, Share Typ Monthly -> 1 Ergebnis ->User_id: 1

Mit dieser sagte ich ohne Erfolg versucht haben, die folgenden Abfragen:

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 

Antwort

1

Nutzung nicht in

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); 
0

Erste Ergebnisse für 2015-1016 sind relativ einfach. Zuerst müssen Sie einen karthesischen erstellen beitreten von user_id - share_type_id und Jahreswerte und linken Aktien Tabelle auf dieser resultset beitreten:

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 

Das Problem ist, wenn Sie 2017 oder jedes andere Jahr in den Mix, die es nicht gibt in der Aktien Tabelle. Mysql selbst kann keinen Wert auswählen, der nicht vorhanden ist.

Sie müssen entweder eine Kalendertabelle erstellen oder eine Reihe von Unions verwenden, um alle Jahre aufzulisten und diese mit der Tabelle Share_users_types zu kombinieren.

Weitere Informationen hierzu finden Sie unter this SO topic.