2016-06-02 9 views
1

Wie mache ich einen SQL JOIN, der beide Tabellen in einer einzelnen Spalte zurückgibt?SQL JOIN gibt beide Tabellen in einer einzigen Spalte zurück

Wie bekomme ich zum Beispiel für eine gegebene Gruppen-ID eine einzige Liste aller Personen, die zu dieser Gruppe gehören, plus all ihren Freunden?

Gruppen

-id 
-name 

groups_have_people

-groups_id 
-people_id 

Menschen

-id 
-name 
-group_id 

people_have_friends

-people_id1 (references people.id) 
-people_id2 (references people.id) 

Zum Beispiel enthält groups_have_peoplepeople_id 1, 2 und 3 für die Gruppe 123 und people_have_friends enthält Aufzeichnungen 1-2, 1-3, 1-4, 2-1, 2-5, ich sollte die folgenden Ergebnisse erhalten:

id Name 
1 Mary 
2 John 
3 Burt 
4 Jill 
5 Sue 

ich etwas tun kann wie folgt, aber es gibt keine einzige Liste zurück.

SELECT p1.*, p2.* 
FROM people p1 
INNER groups_have_people ghp ON ghp.people_id=p1.id 
LEFT OUTER JOIN people_have_friends phf ON p1.id=phf.people_id1 
LEFT OUTER JOIN people p2 ON p2.id=phf.people_id2 
WHERE ghp.groups_id=123; 

EDIT Sieht aus wie vielleicht ich nicht so zu tun, JOIN und soll wie die folgenden, etwas tun?

SELECT p.* 
FROM people p 
INNER groups_have_people ghp ON ghp.people_id=p.id 
WHERE ghp.groups_id=123 
UNION 
SELECT people p1 
INNER JOIN people_have_friends phf ON p1.id=phf.people_id1 
INNER JOIN people p2 ON p2.id=phf.people_id2 
WHERE p2.groups_id=123; 

EDIT 2. mehr Probe hinzufügen Daten

Gruppen

id name 
111 Green 
123 Blue 
222 Yello 

Menschen

id Name 
1 Mary 
2 John 
3 Burt 
4 Jill 
5 Sue 
6 Bob 
7 Wilma 

groups_have_people

groups_id people_id 
111  1 
111  5 
123  1 
123  2 
123  3 
222  3 
222  7 

people_have_friends

people_id1 people_id2 
1   2 
1   3 
1   4 
2   1 
2   5 
4   5 
5   6 

EDIT 3. Was ist so etwas wie die folgenden?

SELECT DISTINCT id, 
       name 
FROM people 
WHERE id IN 
    (SELECT people_id 
    FROM groups_have_people 
    WHERE groups_id=123 
    UNION SELECT phf.people_id 
    FROM people_have_friends phf 
    INNER JOIN groups_have_people ghp ON ghp.people_id=phf.people_id 
    WHERE ghp.groups_id=123); 

oder

SELECT DISTINCT id, 
       name 
FROM people 
INNER JOIN 
    (SELECT people_id 
    FROM groups_have_people 
    WHERE groups_id=123 
    UNION SELECT phf.people_id 
    FROM people_have_friends phf 
    INNER JOIN groups_have_people ghp ON ghp.people_id=phf.people_id 
    WHERE ghp.groups_id=123) x ON x.people_id=people.id; 
+0

, die sehr gut ist, können Sie Ergebnisse zu erwarten, vorausgesetzt, aber könnten Sie Daten liefern rohe Quelle dann? So können wir sehen, wo und wie diese Ergebnisse herkommen. Der beste Weg ist, von einer Geige wie dieser zu beginnen http://sqlfiddle.com/#!9/6bc438 – Alex

+0

@Alex Ich hatte Folgendes in den ursprünglichen Beitrag aufgenommen. Ist das nicht ausreichend?Danke 'Zum Beispiel, groups_have_people enthält people_id 1, 2 und 3 für Gruppe 123, und people_have_friends enthält Datensätze 1-2, 1-3, 1-4, 2-1,2-5, ich sollte die folgenden Ergebnisse erhalten:' – user1032531

+0

Sie haben nicht alle Tabellenmuster zur Verfügung gestellt – Alex

Antwort

0

http://sqlfiddle.com/#!9/89a12/3

SELECT 
    p.id, 
    p.name 
FROM groups_have_people ghp 
INNER JOIN people p 
ON ghp.people_id=p.id 
WHERE ghp.groups_id=123 
UNION 
SELECT 
    p.id, 
    p.name 
FROM groups_have_people ghp 
INNER JOIN people p_temp 
ON ghp.people_id=p_temp.id 
INNER JOIN people_have_friends phf 
ON p_temp.id=phf.people_id1 
INNER JOIN people p 
ON phf.people_id2=p.id 
WHERE ghp.groups_id=123 
+0

Danke Alex. Könnte es optimiert werden? Ich habe ein paar ungetestete Möglichkeiten hinzugefügt? (konnte nicht die sql Geige arbeiten). Vielen Dank – user1032531

Verwandte Themen