2016-05-14 2 views
0

Ich habe einen Zeitplan mit 2 TischenMysql SELECT Reihe NICHT IN UND GROUP zusammen

//user table 
id name 
1 ben 
2 alex 
3 billy 
4 john 

//schedule table 
year month date id 
2016 5  15  2 
2016 5  22  1 // id 1 - ben want to swap his time with others 
2016 5  23  2 
2016 5  30  3 
2016 5  31  1 
2016 5  22  3 

id 1 - ben will seinen Zeitplan mit anderen ppl tauschen.

Ich brauche name FROM Benutzer auswählen Zeitplan und GROUP BY Namen JOIN

als ich diese Benutzernamen benötigen haben keinen Zeitplan bei 2016-5-22

//output should be like this 
id name 
2 alex //he have schedule at 15, 23 
4 john //he don't have any schedule 

billy und ben haben Zeitplan bei 22, so dass sie zeigen sich nicht

ich versuche, wie etwas zu schreiben

SELECT name FROM user LEFT JOIN schedule ON user.id = schedule.id 
WHERE year = 2016 && month = 5 && date != 22 

aber diese Abfrage wird noch billy zeigen, weil billy in einer Reihe haben 2016-5-30

Ist jemand mich mit dieser Abfrage

Antwort

1

Sie müssen zum Filtern helfen können Gruppen keine Zeilen für Ihre Abfrage zu arbeiten. einfache Anleitung WHERE für Zeilen für Gruppen

SELECT name FROM user LEFT JOIN schedule ON user.id = schedule.id 
GROUP BY name 
HAVING SUM(year = 2016)>0 
AND SUM(month = 5)>0 
AND SUM(date=22)=0 

Oder einfacher

...HAVING SUM(CONCAT(year,month,date)='2016522')=0 
+0

Warum SUM (Jahr = 2016)> 0? –

+0

@BenjaminW In mysql Jahr = 2016 oder alle Bedingungen werden zu 1 wenn es gefunden wurde oder 0 wenn nicht. So überprüft es für alle Jahre, wo das Jahr 2016 für jede Zeile in dieser Gruppe ist – Mihai

+0

wow! Vielen Dank! Ich lerne heute etwas! –

1

Die folgende Abfrage erhalten Sie alle Namen, die nicht geplant sind, auf 2016.05.02 arbeiten 2.

SELECT A.NAME FROM USER A 
WHERE A.ID NOT IN(
SELECT A.ID FROM USER A, SCHEDULE B 
WHERE (A.ID=B.ID) 
AND B.YEAR=2016 AND B.MONTH=5 AND B.DATE=22 
)