2016-05-24 10 views
0

Ich führe eine Abfrage für eine Tabelle, wo ich auch verwandte Informationen aus zwei verwandten Tabellen abrufen möchten, die beide viele zu eins relativ zu der primären Tabelle sind.MYSQL: LINKE VERBINDUNG in zwei Tabellen verwendet mit Group_Concatenate

Ich sende dann diese Informationen durch JSON zu einer App und aus diesem Grund bin Gruppe_concatening die mehreren Werte aus den anderen Tabellen. Es funktioniert gut mit einem zusätzlichen Tisch. Wenn ich jedoch eine zweite Tabelle hinzufüge, erhalte ich alle Nebenprodukte der beiden zusätzlichen Tabellen, die ich nicht haben möchte.

Kann jemand vorschlagen, wie man nur einzigartige Werte für die verbundenen Felder erhält?

//current sql 

$sql = SELECT c.*,group_concat(p.name) as `names`, 
group_concat(l.location) as `locations` 
FROM companies `c` 
LEFT JOIN people `p` 
ON p.companyid = c.id 
LEFT JOIN locations `l` 
ON l.companyid = c.id 
GROUP by c.id; 

Der Ausgang grundsätzlich multiplext Namen Werte für jeden Namen nach Ort zu wiederholen, was ich nicht kümmern (und tut das gleiche für Standorte).

Statt

"names":"John,Joe,Jim,Tom,Bob","locations":"Tokyo,London,Manila,Paris,Milan", 

die Ausgabe "names";"John,John,John,John,John,Joe,Joe,Joe,Joe,Joe,...etc.

Vielen Dank für alle Vorschläge auf richtigem Weg, dies zu tun. Edit: Beispieldaten

Companies 
    id|company| 
    1|IBM 
    2|Google 
    3|Apple 
    4|Amazon 

    People 
    id|name|companyid 
    1|John|1 
    2|John|2 
    3|Jim|3 
    4|Bob|4 
    5|Tom|4 

    Locations 
    id|name|companyid 
    1|London|1 
    2|Cupertino|3 
    3|Seattle|3 

Desired output: 
company:IBM, people:John, location:London 
company:Google, people: John location: null 
company:Apple, people:Jim location: Cupertino 
copany:Amazon, people:Bob,Tom location:Seattle 
+1

Sie können mit GROUP_CONCAT DISTINCT verwenden Duplikate zu beseitigen, aber nicht ganz sicher, das ist, was Sie wollen. Normalerweise, wenn ich etwas benötigt habe, ist es, weil ich eine Liste von gepaarten Werten brauche. In diesem Fall habe ich CONCAT() für die 2 Felder verwendet und dann GROUP_CONCAT für die resultierenden Werte. – Kickstart

+1

Wenn Sie uns Beispiel-Eingabedaten zeigen, die die unerwünschten doppelten Namen erzeugen würden, die hilfreich wären. –

+0

Distinct könnte es aber tun, wenn es wirklich zwei Leute gibt, die in einer Firma John heißen, oder zwei Locations namens Green Acres, ich will beides. Grundsätzlich möchte ich einzigartige Menschen und einzigartige Standorte für jedes Unternehmen. – zztop

Antwort

0

Technisch DISTINCT funktionieren sollte:

http://sqlfiddle.com/#!9/5f8074/1

SELECT c.*, 
    GROUP_CONCAT(DISTINCT p.name) as `names`, 
    GROUP_CONCAT(DISTINCT l.name) as `locations` 
FROM companies `c` 
LEFT JOIN people `p` 
ON p.companyid = c.id 
LEFT JOIN locations `l` 
ON l.companyid = c.id 
GROUP by c.id; 

Aber nach Ihren Kommentar möchten Sie gruppieren, auch wenn es einige Duplikate sind.

In diesem Fall können Sie Unterabfrage gesetzt:

SELECT c.*, 
    (SELECT GROUP_CONCAT(p.name) FROM people p WHERE c.id=p.companyid) as `names`, 
    GROUP_CONCAT(DISTINCT l.name) as `locations` 
FROM companies `c` 
LEFT JOIN locations `l` 
ON l.companyid = c.id 
GROUP by c.id;