2016-11-18 3 views
1

Ich habe zwei Tabellen, client und application. Im Grunde sind sie Setup wie folgt aus:MySQL SELECT mit JOIN - wie man richtig codiert

Sagen wir Tabelle client hat 2 Datensätze (Zeilen) nur:

ID | company   | street  | city | country 
1 Tea-Export Ltd. Wallstreet Mumbai India 
2 Tea-Import Ltd. Mainstream London United Kingdom 

Die Tabelle application hat eine Zeile nur:

ID | app_num | seller | buyer 
1 3002  1  2 

Eine Anfrage an die Anwendung Tabelle analysiert die app_num (3002) als Suchparameter. Und die Abfrage sollte nur mit dieser Struktur in einer Anordnung zur Folge hat:

$app_data { 
    [ID] => [1] 
    [app_num] => [3002] 
    seller { 
    [company] => [Tea-Export Ltd] 
    [street] => [Wallstreet] 
    [city] => [Mumbai] 
    [country] => [India] 
    } 
    buyer { 
    [company] => [Tea-Import Ltd] 
    [street] => [Mainstreet] 
    [city] => [London] 
    [country] => [United Kingdom] 
    } 
} 

Ich weiß, das mit einem JOIN durch eine SELECT-Anweisung erreicht werden kann. Und es gibt viele JOIN-Beispiele im Internet, aber keines, das ich studiert habe, passt direkt zu meinem Beispiel. Daher ist jede Hilfe hilfreich, um die richtige MySQL-Anweisung zu erstellen.

EDIT:

Die Lösung von Jehad Ahmad Jaghoub basicly Werke, sondern muss extented und abgeschlossen werden, um alle Adresse Spalten von seller und buyer wie diese zu holen:

(' SELECT 
    s.ID, 
    s.app_num, 
    a.company AS seller_company , 
    a.street AS seller_street , 
    a.house_num AS seller_house_num , 
    a.postal_code AS seller_postal_code , 
    a.city AS seller_city , 
    a.country AS seller_country , 
    b.company AS buyer_company , 
    b.street AS buyer_street, 
    b.postal_code AS buyer_postal_code , 
    b.city AS buyer_city , 
    b.country AS buyer_country 

    FROM `application` AS s 
    LEFT JOIN clients AS a ON s.seller = a.id 
    LEFT JOIN clients AS b ON s.buyer = b.id 
    WHERE s.app_num = :app_num'); 

$app_data { 
    [ID] => [1] 
    [app_num] => [3002] 
    [seller_company] => [Tea-Export Ltd] 
    [seller_street] => [Wallstreet] 
    [seller_house_num] => [45a] 
    [seller_postal_code] => [400036] 
    [seller_city] => [Mumbai] 
    [seller_country] => [India] 
    [buyer_company] => [Tea-Import Ltd] 
    [buyer_street] => [Mainstreet] 
    [buyer_house_num] => [345] 
    [buyer_postal_code] => [] 
    [buyer_city] => [London] 
    [buyer_country] => [United Kingdom] 
} 

Aber es ist verdammt viel von Code, weil man jede Spalte einzeln auswählen muss. Auch wird es in meinem Fall komplizierter, da die Länderspalte eigentlich eine andere ID (country_id) ist, die auf eine separate Landtabelle verweist, die zwei weitere JOIN für Verkäufer und Käufer enthält. UND es gibt nicht nur Verkäufer und Käufer, sondern auch Agenten- und Empfängerspalten, die ich der Einfachheit halber weggelassen habe. Es produziert auch nur ein eindimensionales Array. Gibt es also einfachere Lösungen, um auch ein mehrdimensionales Array zu erhalten, wie in meinem obigen Beispiel?

+0

Sie müssen mit der gleichen Tabelle zweimal mit verschiedenen Aliasen JOIN. – Maximus2012

+0

Können Sie Ihre Frage mit der aktuellen Abfrage aktualisieren, die Sie haben? – Maximus2012

Antwort

1

Können Sie das bitte versuchen? Ich denke, das ist was du willst. Wenn nicht, lass es mich wissen.

SELECT 
    s.*, 
    a.company AS SellerCompany, 
    b.company AS BuyerCompany 
FROM `application` AS s 
LEFT JOIN client AS a ON s.seller = a.id AND s.id = 1 
LEFT JOIN client AS b ON s.buyer = b.id AND s.id = 1 ; 
+0

siehe meinen EDIT oben – Ben

+0

's. *, a. *, b. *' ' –

+0

s SELECT. *, a. *, b. * FROM' application' s AS LEFT JOIN Client AS a ON s.seller = a.id AND s.id = 1 LINKER JOIN-Client AS b ON s.buyer = b.id AND s.id = 1; ' versuchen, das Ergebnis des Arrays auf der Serverseite dafür zu sehen SQL, wie ich es auf phpmyadmin seine Arbeit versuche, aber den gleichen Feldnamen haben, kann es auf der Serverseite sein Genannt als B.id oder B.name? –

1

Sie müssen mit der gleichen Tabelle verschiedenen Aliasnamen zweimal mit JOIN:

SELECT a.ID, a.app_num, seller.*, buyer.* 
FROM Application a 
INNER JOIN Client seller on a.seller = seller.ID 
INNER JOIN Client buyer ON a.buyer = buyer.ID 
WHERE a.app_num='3002' 

Prüfen Sie, ob das funktioniert. seller.* gibt alle Verkäuferdetails und buyer.* gibt alle Käuferdetails. Sie können die Auswahlfelder auch ändern, wenn Sie nur bestimmte Spalten benötigen.

+0

Entschuldigung, das funktioniert nicht. Wenn ich richtig bin, weil "Verkäufer" und "Käufer" nicht "Tabellen" sondern "Spalten" auf der "Client" -Tabelle sind – Ben

+0

mein Kommentar oben ist nicht wahr - vergessen Sie es – Ben

+0

ok das funktioniert, aber nur entweder mit "Verkäufer" oder 'Käufer' abhängig davon, welcher der erste in der SELECT-Anweisung ist. So wie Sie Ihre Antwort abschließen, so dass beide ausgewählt sind? Es erzeugt auch kein mehrdimensionales Array, aber das ist kein Handicap. – Ben