2016-09-28 3 views
0

Zuerst habe ich die folgende SQL-Anweisung:Kombinieren mehrerer Verbindung mysql Aussagen

SELECT * FROM members 
    WHERE username IN (
     SELECT friend2 as username FROM list_friends 
      WHERE (friend1 = 'user' AND friend2 <> 'user') 
      UNION 
     SELECT friend1 as username FROM list_friends 
      WHERE (friend2 = 'user' AND friend1 <> 'user')          
    ) 

Der obige Code funktioniert perfekt. Es gibt alle Zeilen aus der Tabelle 'members' zurück, die der Liste der Freundesliste eines bestimmten Benutzers entsprechen. Diese Liste wird erstellt, indem die Tabelle list_friends für den angegebenen Benutzer durchsucht und der Name des Freundes aus der Spalte friend1 oder friend2 abgerufen wird.

Wie ich schon sagte, es funktioniert einwandfrei.

Next Ich habe die folgende SQL-Anweisung:

SELECT username, 
(SELECT COUNT(*) FROM sites WHERE username = 'user') 
+ (SELECT COUNT(*) FROM banners WHERE username = 'user') 
+ (SELECT COUNT(*) FROM stream_updates WHERE username = 'user') 
    AS cnt from members WHERE username = 'user' 

Dadurch werden die Zählungen der gegebenen Zeilen und Ausgabe der Gesamtsumme aller COUNT als Spalte cnt kombinieren.

Ich möchte diese beiden Aussagen kombinieren, damit ich ein Ergebnis erhalten kann, das Freund, cnt zurückgibt.

Beispiel Ausgabe wäre sehr einfach:

username | cnt 
---------------------- 
    a friend  | 6525 
    diff friend | 983 
    yet again | 3485 

ich dies leicht in zwei PHP-Loops laufen konnte, zuerst die Namen der Freunde aus der ersten Abfrage, und dann eine foreach verwenden und die zweite Abfrage ausführen In der Schleife der ersten Abfrage frage ich mich, ob es einen besseren Weg gibt, oder eine Möglichkeit, die Anweisungen anders zu kombinieren, um die obige Ausgabe zu erhalten.

+0

Möchten Sie die Anzahl von der ersten Abfrage oder alle Zeilen? –

+0

Die erste Abfrage gibt die "Freunde" zurück. Ich möchte dann, dass jeder Freund durch die zweite Abfrage geführt wird, um diesen Freund "cnt" zu bekommen. – Bruce

+0

Um dies wirklich klar zu machen, bekommen wir eine "Freundesliste" für einen bestimmten Benutzer, dann zählen wir jeden Benutzer dieser Freundesliste die gesamten "Aktionen", die sie ausgeführt haben. – Bruce

Antwort

1

Ich glaube, Sie wollen nur korrelierte Unterabfragen:

SELECT username, 
     ((SELECT COUNT(*) FROM sites s WHERE s.username = f.username) + 
     (SELECT COUNT(*) FROM banners b WHERE b.username = f.username) + 
     (SELECT COUNT(*) FROM stream_updates su WHERE su.username = f.username) 
     ) as cnt 
FROM (SELECT friend2 as username 
     FROM list_friends 
     WHERE friend1 = 'user' AND friend2 <> 'user' 
     UNION 
     SELECT friend1 as username 
     FROM list_friends 
     WHERE friend2 = 'user' AND friend1 <> 'user'          
    ) f; 

Hinweis: Sie brauchen nicht die members Tabelle hier. Sie haben die username von den anderen Tabellen.

+0

Sie fehlen ein + am Ende der dritten Zeile, aber das ist genau das, was ich tun wollte! Vielen Dank. – Bruce

+0

@Bruce. . . Ich bin froh, dass das geholfen hat. Es ist eine komplizierte Abfrage. Prost. –