2017-07-26 2 views
0

Ich habe diese Anfrage:MySQL, kommen viele zu viele Beziehung Abfrage

SELECT 
    GROUP_CONCAT(DISTINCT 
     `persons`.`name`, 
     '[START_Name_END]', 
     `persons`.`id`, 
     '[START_Id_END]', 
     `persons`.`isteacher`, 
     '[START_IsTeacher_END]' 
    SEPARATOR '[START_ROWSEPERATOR_END]') AS persons_values, 
    `locations`.`name` AS locations_name, 
    `locations`.`id` AS locations_id 
FROM `locations` 
INNER JOIN `locations_persons` ON `locations_persons`.`location_id` = `locations`.`id` 
INNER JOIN `persons` ON `persons`.`id` = `locations_persons`.`person_id` 
GROUP BY `locations`.`id` 
ORDER BY `locations`.`id` 

Der Grund, warum ich GROUP_CONCAT ist alle Zeilen aus persons Tisch zu bekommen, die Referenz in der Zuordnungstabelle haben, in der gleichen Spalte

Ich verwende [START_Name_END], [START_Id_END], um das Ergebnis später in meinem Code und [START_ROWSEPERATOR_END] zu teilen, um festzustellen, ob es die gleiche Zeile oder eine neue Zeile ist.

Alles funktioniert soweit ganz gut.

Die Sache ist, wenn irgendeine Reihe in locations Tabelle keinen Bezug auf irgendeine Reihe in persons Tabelle hat, bekomme ich NICHT diese Reihe in den Resultaten!

Ich glaube, dass das Problem in JOIN ist, was soll ich verwenden, um alle Zeilen unabhängig davon abzurufen, ob diese Zeile Verweis in der Zuordnungstabelle hat oder nicht?

Jede Hilfe würde sehr geschätzt werden!

+1

Fügen Sie Ihrer Abfrage einige Zeilenumbrüche hinzu –

+1

Ihr Code ist nicht lesbar. Bitte formatieren Sie richtig. Wahrscheinlich versuchen Sie 'LEFT JOIN'. – Eric

+0

Habe ich, Hoffentlich ist es jetzt besser lesbar! Jeffs Lösung funktionierte, aber ich frage mich nur, ob es in einem anderen Szenario ein Problem verursachen könnte – Niroda

Antwort

1

Versuchen Sie es mit:

LEFT OUTER JOIN `locations_persons` ... 

-

Leider bearbeiten, ich bin neu auf diese Dinge zu beantworten und Stackoverflow diese nicht die Aufmerksamkeit geben, dass es vor dem Antworten verdient.

Ihre Tabellenstruktur ist eine klassische Viele-zu-Viele-Verknüpfung. Wenn also für einen bestimmten Standort keine Person vorhanden ist, sind in der Standorttabelle nur Standortdaten vorhanden. Als solche müssten Sie einen LINKEN ÄUSSEREN JOIN für den Beitritt auf locations_persons und den Beitritt von locations_persons zu Personen haben.

Wenn Sie immer noch Probleme haben, werde ich eine schnelle MySQL-Datenbank erstellen und die Dinge austesten .. Ich werde das von nun an tun, aber dachte, ich sollte jetzt wegen meiner schlechten Teilantwort früher antworten.

--Edit2

In Bezug auf Fragen erwarten: Wenn Sie Outer-Joins links, jeder kommen, dass nicht (dh es gibt Zeilen auf der linken Seite, aber kein Spiel auf der rechten Seite) wird die Tabellen von rechts hat Rückkehr alle Nullwerte In diesem Fall möchten Sie, dass Ihre Abfrage alle Felder in locations_persons und persons, die Nullwerte zurückgeben, ordnungsgemäß verarbeitet. .

Wenn GROUP_CONCAT nicht mit diesem gut umgehen (ich bin nicht mit ihm vertraut), könnten Sie diese Personen wickeln müssen mit * gekennzeichneten Felder in einem IFNULL, wenn Sie Probleme haben:

SELECT 
    GROUP_CONCAT(
    DISTINCT `persons`.`name`, 
    '[START_Name_END]', 
    IFNULL(`persons`.`id`, ''), 
    '[START_Id_END]', 
    IFNULL(`persons`.`isteacher`, ''), 
    '[START_IsTeacher_END]' SEPARATOR '[START_ROWSEPERATOR_END]' 
) AS persons_values, 
    `locations`.`name` AS locations_name, 
    `locations`.`id` AS locations_id 
FROM 
    `locations` 
    LEFT OUTER JOIN `locations_persons` ON 
    `locations_persons`.`location_id` = `locations`.`id` 
    LEFT OUTER JOIN `persons` ON 
    `persons`.`id` = `locations_persons`.`person_id` 
GROUP BY 
    `locations`.`id` 
ORDER BY 
    `locations`.`id` 
+0

Leider das gleiche Problem! – Niroda

+0

Sie verwenden zwei INNER JOINs, ist es möglich, dass ein fehlender Eintrag von PERSONS auch Dinge unterdrückt? Verwendet eine LINKE OUTER JOIN auf beide Ihre Joins beheben die Dinge? Wenn nicht, könnten Sie einige Tabellendefinitionen und INSERTS mit Beispieldaten zusammen mit Ihren erwarteten Ergebnissen? Sie haben keine WHERE-Klausel hier, so dass die Joins der einzige mögliche Ort, wo Daten sind LEFT OUTER JOIN wird alle Zeilen von der linken Seite des Joins einschließen und NULL Werte für die Felder von der fehlenden rechten Seite verwenden –

+0

Danke Jeff! Es tut! Meine Frage ist jetzt, würde OUTTER LINKS JOIN verursacht irgendwelche Probleme? – Niroda