2012-04-13 10 views
1

Ich versuche, eine SQL-Abfrage zu erhalten, um NULL-Werte mit einem LINKEN OUTER JOIN zwischen meinen beiden Tabellen zurückzugeben.Rückgabe mehrerer Nullwerte mit Outer-Join

Eine Tabelle enthält Benutzerinformationen, und die andere enthält Roll-Call-Informationen. Im Wesentlichen versuche ich eine HTML-Tabelle zu generieren, um anzuzeigen, ob jemand für jeden Monat einen Appell unterfertigt hat oder nicht. Wenn der Wert NULL ist, bedeutet dies, dass sie zum Zeitpunkt dieses Appells nicht Mitglied waren.

Das Problem, das ich gerade habe, ist, dass die Abfrage nur einen NULL-Wert zurückgibt, auch wenn sie kein Mitglied für mehr als einen Appell waren. Hier ist die Abfrage, die ich bin mit dem der Benutzer war kein Mitglied für mehr als eine namentliche:

SELECT m.userid, r.status, r.rollcallid 
FROM fleetmgr_members AS m 
    LEFT OUTER JOIN fleetmgr_rollcall_log AS r 
    ON m.userid = r.userid AND r.rollcallid IN(1, 5) 
WHERE m.userid = 2089 
ORDER BY m.currentName, r.rollcallid; 

Diese Abfrage liefert:

userid status rollcallid 
2089 NULL NULL 

Ich will es zurück:

userid status rollcallid 
2089 NULL 1 
2089 NULL 5 

Aus irgendeinem Grund ist es völlig ratlos, das zu erreichen, was ich will. Ich danke Ihnen im Voraus für Ihre Hilfe.

fleetmgr_rollcall_log Tabelle:

id  rollcallid userid date_signed status activity  comments  
    2  1   652  1330563886 signed 6-8 hrs/week - 
    29 1   2462  1330565521 signed 9-11 hrs/week - 
    1823 5   731  1333300321 signed 0-2 hrs/week - 
    2293 5   166  1333901983 exempt 0-2 hrs/week - 

fleetmgr_members Tabelle:

id  userid  currentName 
1   3  SomeUsername 
2   5  DifferentUsername 
+0

Haben Sie eine Tabelle, die alle Rollrufe auflistet? – ESG

Antwort

1

Wie wäre es so etwas wie dieses

SELECT r1.rollcallid, r2.status 
FROM (
    SELECT DISTINCT rollcallid 
    FROM fleetmgr_rollcall_log 
    ) AS r1 
LEFT JOIN fleetmgr_rollcall_log AS r2 
ON r1.rollcallid=r2.rollcallid AND r2.userid=2089 
ORDER BY r1.rollcallid; 

ich keine Benutzerdaten als einzige Benutzerdaten zurückgegeben haben Sie in Ihrer Probe Ergebnisse haben, ist die user_id, die Sie bereits wissen, wie es in der Abfrage ist.

+0

Ich habe nur Userid als Test zurückgegeben. Ihre scheint gut zu funktionieren Es gab eine Reihe mit einem rollcallid von 0 aus irgendeinem Grund zurück, aber ich fügte einfach WHERE r1.rollcallid hinzu! = 0, um diese Reihe loszuwerden. Dank soviel! – Sharpk1ll3r

0

Versuchen Sie, diese

SELECT m.userid, r.status, r.rollcallid 
FROM fleetmgr_members m, fleetmgr_rollcall_log r 
WHERE m.userid = 2089 AND r.rollcallid IN(1, 5) 
ORDER BY m.currentName, r.rollcallid; 

Und was ist diese (mit CROSS JOIN):

SELECT m.userid, r.status, r.rollcallid 
FROM fleetmgr_members m cross join fleetmgr_rollcall_log r 
WHERE m.userid = 2089 AND r.rollcallid IN(1, 5) 
ORDER BY m.currentName, r.rollcallid; 
+0

Dieser gibt alle 1.253 Zeilen zurück und ersetzt nur die tatsächliche Benutzer-ID durch 2089. – Sharpk1ll3r

0

Verschieben Sie die r.rollcallid IN (1, 5) in die Where-Klausel, nicht die Join-Klausel.

+0

Ich habe es versucht, es gibt einfach eine leere Menge zurück. :( – Sharpk1ll3r

+0

Es sieht aus wie die Fleetmgr_members ist ein bisschen ein Ablenkungsmanöver. Und der Beitritt. Betrachten: SELECT * FROM fleetmgr_rollcall_log WHERE userid = 2089 und Status ist NULL UND rollcallid IN (1, 5); – scorpdaddy

+0

Ein weiterer leerer Satz.:/ – Sharpk1ll3r

0

Warum funktioniert das nicht?

SELECT m.userid, r.status, r.rollcallid 
FROM fleetmgr_members AS m 
    LEFT OUTER JOIN fleetmgr_rollcall_log AS r 
    ON m.userid = r.userid 
WHERE m.userid = 2089 AND r.rollcallid IN(1, 5) 
ORDER BY m.currentName, r.rollcallid; 
Verwandte Themen