2016-07-05 28 views
0

Ich habe zwei Tabellen:Erhalten Sie Datensätze aus einer Tabelle und einer entsprechenden Tabelle

orders 
poid | user | pid | payment_id 
1 | 1 | 1 | abc123 
2 | 2 | 2 | def345 

orders_addon 
poaid | user | poid | pid 
1  | 1 | 1 | 3 
2  | 1 | 1 | 5 

One steht für Aufträge, stellen die zweite Addons ein Benutzer seine Bestellung hinzufügen.

Es gibt immer eine Reihe in Bestellungen und es kann vorkommen, dass es keine passenden orders_addon für eine Bestellung gibt.

Ich bin auf der Suche nach einer Abfrage, die übereinstimmende Zeilen aus Bestellungen und orders_addon gibt, wenn es passende gibt.

SELECT Benutzer, pid FROM ... WHERE payment_id = 'abc123'

Sollte Rückkehr

user | pid 
1 | 1 
1 | 3 
1 | 5 

Und die gleiche Abfrage sollte nur die Ergebnisse aus der Tabelle Bestellungen zurück, wenn kein passender Datensatz in die Tabelle orders_addon.

SELECT Benutzer, pid FROM ... WHERE payment_id = ‚def345‘

user | pid 
2 | 2 

Ich rechne damit, dies getan UNION verwenden werden könnte, aber dann würde ich nicht in der Lage sein, um die Tabellen zu entsprechen, und es wäre worden Problem dar, da der orders_addon Tabelle nicht über einen payment_id

Antwort

0

Mit LINKS MIT IF RECHNUNG JOIN

mysql> (SELECT u.user,IFNULL(ua.pid ,u.pid) as pid 
      FROM orders u 
      inner JOIN orders_addon ua on ua.poid=u.poid 
      WHERE u.payment_id = 'abc123' 
     ) 
    union all 
     (SELECT u.user,u.pid 
      from orders u 
      where u.payment_id = 'def345' 
    ); 
+------+------+ 
| user | pid | 
+------+------+ 
| 1 | 3 | 
| 1 | 5 | 
| 2 | 2 | 
+------+------+ 
3 rows in set (0.00 sec) 

mysql> (SELECT u.user,IFNULL(ua.pid ,u.pid) as pid 
      FROM orders u 
      inner JOIN orders_addon ua on ua.poid=u.poid 
      WHERE u.payment_id = 'def345' 
     ) 
    union all 
     (SELECT u.user,u.pid 
      from orders u 
      where u.payment_id = 'def345' 
     ); 

+------+------+ 
| user | pid | 
+------+------+ 
| 2 | 2 | 
+------+------+ 
1 row in set (0.00 sec) 
+0

bitte versuchen Sie diese und lassen Sie mich –

+0

Für das erste Beispiel wissen dieses gibt nur 2 Zeilen zurück, das Ergebnis aus der Auftragstabelle fehlt. – maddo7

+0

@ maddo7 aktualisierte Abfrage bitte jetzt überprüfen –

Verwandte Themen