2012-04-09 4 views
2

Ich bin der weltweit neueste konvertieren zu den Freuden von LINKER JOIN. Die folgende arbeitet schön:Wie Links Link Join A nach B auf X, dann verbinden B zu C auf Y

$STH = $DBH->prepare(" 
SELECT cc.cat_subject, cc.cat_major, cc.cat_minor, cc.cat_name, c.cnum, c.unmod 
    FROM comment_category cc 
LEFT JOIN comment c 
    ON cc.cat_subject = c.cat_subject AND cc.cat_major = c.cat_major AND cc.cat_minor = c.cat_minor 
ORDER BY cc.cat_subject, cc.cat_major, cc.cat_minor"); 

Was soll ich jetzt tun, aber Referenz ist eine weitere Tabelle favourite (f), die nur ein gemeinsames Feld cnum mit comment (c) und keine mit comment_category (cc) hat.

Ich habe versucht, die folgenden:

$STH = $DBH->prepare(" 
SELECT cc.cat_subject, cc.cat_major, cc.cat_minor, cc.cat_name, c.cnum, c.unmod, f.favourite 
FROM comment_category cc 
LEFT JOIN comment c 
    ON cc.cat_subject=c.cat_subject AND cc.cat_major=c.cat_major AND cc.cat_minor=c.cat_minor 
LEFT JOIN favourite f 
    ON c.cnum=f.cnum 
ORDER BY cc.cat_subject, cc.cat_major, cc.cat_minor"); 

Es funktioniert nicht. Ich rate (von dem, was ich gelesen habe), dass das ist, weil ich tatsächlich eine andere Verbindung zu comment_category (cc) anstatt zu comment (c) anfrage.

Kurz gesagt: Wie wähle ich von A, LINKE VERBINDUNG zu B, aber verwenden Sie dann ein Feld in B, um auf einen Wert von C zuzugreifen?

UPDATE (wegen Unlust Punter):

Die Tische sind:

comment_category 
---------------- 
subject (int) 
cat_major (int) 
cat_minor (int) 
name  (varchar) 

comment 
------- 
cnum  (int) 
subject (int) 
cat_major (int) 
cat_minor (int) 
unmod  (varchar) 

favourite 
--------- 
cnum  (int) 

... ich hier aufhören werde - es stürzt ab, weil es in der favourite Tabelle kein Lieblingsfeld ist.

Mein Fehler. Entschuldigung, alles.

+1

Sind Sie auf der Suche nach etwas wie: SELECT blah aus einem LINKEN JOIN B auf B.b = A.a LINKE JOIN C auf C.c = B.etwas? Ihre SQL sieht gültig aus. Welche Fehler bekommst du? – Corbin

+3

Was meinst du "Es funktioniert nicht."? Error? Keine Zeilen zurückgegeben? –

+0

Entschuldigung, alle. Keine Zeilen zurückgegeben. Ich werde die Frage aktualisieren. – Nick

Antwort

1

Ich bin froh, dass Sie das selbst herausgefunden haben. Da Sie sagen, dass Sie neu bei JOINs sind, wollte ich hinzufügen, dass wenn Sie mehr als 2 Tabellen gleichzeitig verbinden, es eine gute Idee ist, einen INNEREN JOIN zu verwenden. Der Unterschied besteht darin, dass ein LINKER LINK Zeilen auf der LINKEN Seite (in diesem Fall eine Kommentarkategorie) zurückgibt, unabhängig davon, ob Sie eine Übereinstimmung im Kommentar haben oder nicht. Ein INNER JOIN gibt keine Zeilen aus der Kategorie comment_category zurück, es sei denn, es wurde auch eine Übereinstimmung im Kommentar gefunden.

Der Grund, warum dies in diesem Szenario wichtig ist, ist, dass Ihre Abfrage zuerst in einer Zeile von comment_category im Kommentar übereinstimmen muss, damit Ihr JOIN auf Favorit alles außer NULL zurückgibt. Wenn Sie INNER JOIN für comment_category und comment verwenden, ist die Fehlerbehebung weniger eindeutig. Auch die Verwendung von INNER JOINs wird NULL-Werte aus Ihren Ergebnissen eliminieren (NULL, die aus der JOIN-Nichtübereinstimmung resultieren).

Die Verwendung von LEFT vs. INNER JOIN hängt auch von Ihren Geschäftsanforderungen ab. Wenn beispielsweise alle Zeilen in der Kategorie comment_category einfach eine Übereinstimmung im Kommentar aufweisen müssen, sollten Sie einen INNER JOIN verwenden. Aber wenn Sie Kommentare abfragen, die nicht notwendigerweise Favoriten haben müssen (aber Sie wollen, dass sie zurückgegeben werden, wenn es welche gibt), dann sollten Sie einen LINKEN JOIN verwenden. Hoffe das hilft.

+0

Danke dafür.Ich werde weiter damit spielen. – Nick

Verwandte Themen