2017-09-28 7 views
0

Ich habe zwei Tabellen, ready_for_client und ready_to_ship. Die Strukturen für beide Tabellen sind fast gleich.Mysql Abfrage zwei Tabellen beitreten Bedingung

id (int) 
    client_id (int) 
    truck_id (int) 
    driver_id (int) 
    list (varchar 50) 
    is_done (tinyint 1) 

ready_for_client hat rts_id (varchar 32) und ready_to_ship hat rfc_id (varchar 32)

Was ich will, ist drei verschiedene Abfragen, die ersten beiden Tabellen abfragen, wo die rts_id und rfc_id gleich ist. Ich habe die erste und es funktioniert.

SELECT rfc.id AS Ready_For_Client_id, rfc.rts_id, t.Truck_Number, u.Name AS User_Name, c.Name AS Client_Name FROM ready_for_client rfc 
     INNER JOIN trucks t ON rfc.truck_id = t.id 
     INNER JOIN users u ON rfc.driver_id = u.id 
     INNER JOIN clients c ON rfc.client_id = c.id 
     INNER JOIN ready_to_ship rts ON rfc.rts_id = rts.rfc_id 
    WHERE rfc.is_done = 0 

Dies produziert einen Datensatz genau so, wie es sollte. Die zweite und dritte Abfrage möchte ich alle anderen Datensätze für beide Tabellen jeweils auswählen, die die RFC_ID und RTS_ID nicht teilen.

Ich dachte über die gleiche Abfrage, aber auf der vierten INNER JOIN haben es nicht gleich.

SELECT rfc.id AS Ready_For_Client_id, rfc.rts_id, t.Truck_Number, u.Name AS User_Name, c.Name AS Client_Name FROM ready_for_client rfc 
     INNER JOIN trucks t ON rfc.truck_id = t.id 
     INNER JOIN users u ON rfc.driver_id = u.id 
     INNER JOIN clients c ON rfc.client_id = c.id 
     INNER JOIN ready_to_ship rts ON rfc.rts_id != rts.rfc_id 
    WHERE rfc.is_done = 0 

Aber das ist die die Aufzeichnungen zu verdoppeln und auch die, die einen Datensatz enthält, die die gemeinsame rts_id und rfc_id hat.

Weiß jemand, wie ich diese zweite und dritte Abfrage einstellen würde, um zu tun, was ich brauche?

- Bearbeiten -

ready_for_client

+----+-----------+----------+-----------+---------------------------+----------------------------------+---------+ 
    | id | client_id | truck_id | driver_id | list      | rts_id       | is_done | 
    +----+-----------+----------+-----------+---------------------------+----------------------------------+---------+ 
    | 1 |   1 |  2 |   7 | 175      | 2bcd069351002c4d92ba151ae67212ad |  0 | 
    | 2 |   2 |  2 |   7 | 231      | 95e906dec3c83b1c9bfbe3f0d6920aaf |  0 | 
    | 3 |   2 |  1 |   7 | 88,89,90,91    | e82ac070985e21ced4fb203c515b1618 |  0 | 
    | 4 |   3 |  1 |   7 | 37,249,38,39,40,41,109,42 | d21b5ac4a4da0e57b85a464c3a6fd511 |  0 | 
    +----+-----------+----------+-----------+---------------------------+----------------------------------+---------+ 

ready_to_ship

+----+-----------+----------+-----------+-------+----------------------------------+---------+ 
    | id | client_id | truck_id | driver_id | list | rfc_id       | is_done | 
    +----+-----------+----------+-----------+-------+----------------------------------+---------+ 
    | 1 |   3 |  1 |   7 | 1  | 10e938e49a67117273683535cebbe8cc |  0 | 
    | 2 |   3 |  1 |   7 | 2,3,4 | d21b5ac4a4da0e57b85a464c3a6fd511 |  0 | 
    +----+-----------+----------+-----------+-------+----------------------------------+---------+ 

Ausgang für die zweite Abfrage, versuchen, alle anderen Datensätze aus ready_for_client wählen:

+---------------------+----------------------------------+--------------+------------+----------------------+ 
    | Ready_For_Client_id | rts_id       | Truck_Number | User_Name | Client_Name   | 
    +---------------------+----------------------------------+--------------+------------+----------------------+ 
    |     1 | 2bcd069351002c4d92ba151ae67212ad |   20 | driver  | client name   | 
    |     1 | 2bcd069351002c4d92ba151ae67212ad |   20 | driver  | client name   | 
    |     2 | 95e906dec3c83b1c9bfbe3f0d6920aaf |   20 | driver  | client name   | 
    |     2 | 95e906dec3c83b1c9bfbe3f0d6920aaf |   20 | driver  | client name   | 
    |     3 | e82ac070985e21ced4fb203c515b1618 |   10 | driver  | client name   | 
    |     3 | e82ac070985e21ced4fb203c515b1618 |   10 | driver  | client name   | 
    |     4 | d21b5ac4a4da0e57b85a464c3a6fd511 |   10 | driver  | client name   | 
    +---------------------+----------------------------------+--------------+------------+----------------------+ 

Es sollte nur für Read_For_Client_id 1 2 und 3 sein. Keine ID 4 und keine Verdoppelung von 1 2 und 3.

+1

Bild, wenn Sie können, dass ich Sie gebeten, für Tabellen 3 Abfragen erzeugen Sie noch nie gesehen .... immer bietet „Beispieldaten“ und „erwartetes Ergebnis“ * (als wieder verwendbare Text oder SQL-Einsätze) * als So erhalten Sie schnell und präzise Antworten. –

+0

können Sie verwenden, wo Bedingung wie 'where rfc.rts_id! = Rts.rfc_id' sein kann, die Ihnen Ihre Lösung – Jenish

+0

Sorry geben, nicht einmal daran denken. Ich habe einige Daten und das Ergebnis der zweiten Abfrage hinzugefügt. –

Antwort

1

Sie möchten die Zeilen finden, wo die IDs nicht gleich sind, aber Sie müssen die Multiplikation von Zeilen vermeiden. Hier sind zwei Techniken dafür.

eine LEFT JOIN aber dann diejenigen auszuschließen, in denen die Verbindung besteht

SELECT 
     rfc.id AS Ready_For_Client_id 
    , rfc.rts_id 
    , t.Truck_Number 
    , u.Name AS User_Name 
    , c.Name AS Client_Name 
FROM ready_for_client rfc 
INNER JOIN trucks t ON rfc.truck_id = t.id 
INNER JOIN users u ON rfc.driver_id = u.id 
INNER JOIN clients c ON rfc.client_id = c.id 
LEFT JOIN (
     SELECT 
      rfc.id 
     FROM ready_for_client rfc 
     INNER JOIN ready_to_ship rts ON rfc.rts_id = rts.rfc_id 
     WHERE rfc.is_done = 0 
    ) d ON rfc.rts_id = d.id 
WHERE d.id IS NULL 
; 

Verwenden NICHT VORHANDEN. Identifizieren Sie, ob die aktuelle Zeile eine Übereinstimmung in der anderen Tabelle aufweist, wenn diese Zeile ignoriert wird.

SELECT 
     rfc.id AS Ready_For_Client_id 
    , rfc.rts_id 
    , t.Truck_Number 
    , u.Name AS User_Name 
    , c.Name AS Client_Name 
FROM ready_for_client rfc 
INNER JOIN trucks t ON rfc.truck_id = t.id 
INNER JOIN users u ON rfc.driver_id = u.id 
INNER JOIN clients c ON rfc.client_id = c.id 
WHERE rfc.is_done = 0 
AND NOT EXISTS (
     SELECT NULL 
     FROM ready_to_ship rts 
     WHERE rfc.rts_id = rts.rfc_id 
    ) 
; 
+0

Perfekt, danke. Der LINKE JOIN fügte noch die ready_for_client ID 4 hinzu (d21b5ac4a4da0e57b85a464c3a6fd511). Aber dein zweites Beispiel NOT EXISTS funktioniert. Ich habe es auch anders versucht, indem ich aus ready_to_ship wähle und es funktioniert! –