2016-06-20 6 views
1

Ich möchte eine Tabelle abfragen und dann der zweiten Tabelle beitreten, aber wenn in der zweiten Tabelle keine Daten vorhanden sind, wird nur angezeigt, was in der ersten Tabelle steht.Abfrage zwischen zwei Tabellen, aber auch um anzuzeigen, wenn keine Daten in einer der Tabellen vorhanden sind

So gibt es Tisch orders und Tabelle payments was ich versuche, so etwas wie dieses

SELECT orders. * , payments. * 
FROM orders 
INNER JOIN payments ON orders.user_id = payments.userID 
WHERE orders.user_id =3 
AND payments.processed = '' 
OR payments.processed >= '0' 

Diese Abfrage einige seltsame Ergebnisse zurück .. Momentan gibt es drei Datensätze in der Tabelle orders und 2 Datensätze in der Tabelle ist payments für user_id = 3. Es sollte mir 3 Datensätze überhaupt zurückgeben, weil sie 3 in orders sind. Aber es gibt mir jeden Datensatz von orders zweimal zurück, d.h. 6 Ergebnisse.

Was fehlt mir hier?

+0

Klammer machen zwischen und und oder wie UND (payments.processed = '' ODER payments.processed> = '0') – Bhavin

Antwort

0

Dieser Mangel an Klammer aufgrund geschieht auf den AND und OR ‚s, AND hat Vorrang vor OR:

SELECT orders. * , payments. * 
FROM orders 
INNER JOIN payments ON orders.user_id = payments.userID 
WHERE orders.user_id =3 
    AND (payments.processed = '' 
     OR payments.processed >= '0') 

Ihre Abfrage als es wie folgt bewertet wird:

WHERE (orders.user_id =3 AND payments.processed = '') 
    OR(payments.processed >= '0') 

Ein weiterer Sache, die die Ergebnisse multiplizieren kann, ist, dass jede Bestellung mehr als eine Zahlungen hat.

+0

Wieder ist jeder Datensatz 2 mal .. sie müssen 3 sein, weil ich 3 Datensätze in 'orders '+ 2 in 'Zahlungen' Ich muss insgesamt 3 Datensätze sehen. –

+0

Zahlung ist nur eine für jede Bestellung. –

+0

Für jede Bestellung, ist es eine für jeden Benutzer? Sie treten von 'user_id' nicht' order_id' @Stan – sagi

0

Nun je nach Abfrage sou talbes ein bisschen so aussehen muss:

Orders: 
ID | user_ID | ... 
---+---------+---- 
01 |  3 | ... 
02 |  3 | ... 
03 |  3 | ... 

Payments: 
ID | userID | processed | ... 
---+---------+-----------+---- 
01 |  3 |   | ... 
02 |  3 |  1  | ... 

Jetzt ist meine Frage, warum sind Sie auf der Benutzer-ID anzuschließen? Natürlich läuft die Datenbank für jeden Auftrag den Join und sieht aus wie viele Zahlungen mit derselben Benutzerkennung gefunden werden. Das heißt also für jeweils drei Bestellungen mit user_id = 3 findet es zwei Zahlungen mit userID = 3. Das ist 2 * 3 = 6, also werden sechs Zeilen ausgewählt, genau wie du gesagt hast.

Wenn Sie alle Bestellungen mit einer zugehörigen Zahlung auswählen möchten, muss eine Beziehung zwischen Zahlungen und Bestellungen bestehen. Und in Ihrem Fall seine eine Beziehung mit einem ordeer kann 0-1 Zahlung hat, das bedeutet, dass Ihre Datentabelle ein bisschen so aussehen sollte:

Orders: 
ID | user_ID | ... 
---+---------+---- 
01 |  3 | ... 
02 |  3 | ... 
03 |  3 | ... 

Payments: 
ID | userID | OrderID | processed | ... 
---+---------+---------+-----------+---- 
01 |  3 | 01 |   | ... 
02 |  3 | 02 |  1  | ... 

FOREIGN KEY Payments.OrderID -> Orders.ID 

In diesem Fall cou kann Payments.OrderID beitreten als Fremdschlüssel auf Bestellungen s. ICH WÜRDE.

importent: Wenn Sie alle Bestellzeilen erhalten möchten, müssen Sie eine LEFT JOIN verwenden und keine INNER JOIN!

SELECT orders. * , payments. * 
FROM orders 
LEFT JOIN payments ON payments.OrderID = orders.ID 
WHERE orders.user_id = 3 
... 

Maby sollten Sie uns Struktur Sie Datenbank zeigen, damit wir einen Blick auf Ihre tatsächlichen refrences zwischen Ihnen Tabellen nehmen könnte.

+0

Es gibt keine Fremdschlüssel zwischen ihnen. Aber ich erkundige mich erfolgreich, indem ich mich jetzt anmelde und bezahlte Bestellungen zeige. Aber ich möchte auch unbezahlt zeigen, also will ich nur Ordnung zeigen, auch wenn es keine Zahlungen gibt –

Verwandte Themen