2010-03-15 3 views
10

Lassen Sie mich also mit dem Vorwort sagen, dass ich kein SQL-Assistent bin. Was ich tun möchte, ist ein einfaches Konzept, hat mich aber mit einer kleinen Herausforderung konfrontiert, als ich versuchte, die Anzahl der Datenbankabfragen zu minimieren, die ich ausführe.Minimieren von SQL-Abfragen mithilfe von Join mit einer 1: n-Beziehung

Sagen wir, ich habe eine Tabelle von Abteilungen. In jeder Abteilung gibt es eine Liste von Mitarbeitern.

Was ist der effizienteste Weg, um alle Abteilungen aufzulisten und welche Mitarbeiter in jeder Abteilung sind.

So zum Beispiel wenn ich eine Abteilung Tisch mit:

id name 
1 sales 
2 marketing 

Und einen Menschen Tisch mit:

id department_id name 
1 1    Tom 
2 1    Bill 
3 2    Jessica 
4 1    Rachel 
5 2    John 

Was ist der beste Weg Liste alle Abteilungen und alle Mitarbeiter für jeden Abteilung wie folgt:

Verkäufe

  • Tom
  • Bill
  • Rachel

Marketing-

  • Jessica
  • John

Täuschen Sie vor, beide Tabellen sind wirklich massiv. (Ich möchte vermeiden, eine Liste von Abteilungen zu erhalten, und dann das Ergebnis durchlaufen und eine individuelle Abfrage für jede Abteilung durchführen). Ähnliches gilt für die Auswahl der Status/Kommentare in einem Facebook-ähnlichen System, wenn Status und Kommentare in separaten Tabellen gespeichert sind.

+1

+1 für den Versuch, die Schleife Mentalität des imperativen Programmierers zu befreien. Es ist es wert. – spender

Antwort

11

Sie können alles in einer einzigen Abfrage mit einem einfachen bekommen verbinden, zB:

SELECT d.name AS 'department', p.name AS 'name' 
FROM  department d 
    LEFT JOIN people p ON p.department_id = d.id 
ORDER BY department 

Dieses gibt alle Daten, aber es ist ein bisschen wie ein Schmerz zu verbrauchen, da Sie durchlaufen müssen, werden durch jede Person sowieso. Sie können noch weiter gehen und gruppieren sie zusammen:

SELECT d.name AS 'department', 
     GROUP_CONCAT(p.name SEPARATOR ', ') AS 'name' 
FROM  department d 
    LEFT JOIN people p ON p.department_id = d.id 
GROUP BY department 

Sie werden so etwas wie dies als Ausgabe erhalten:

department | name 
-----------|---------------- 
sales  | Tom, Bill, Rachel 
marketing | Jessica, John 
+0

Das ist genau die Art von Ding, die ich brauchte. Danke für die Information über GROUP BY und GROUP_CONCAT in diesem Fall. Genau das, was ich gesucht habe. – Brian

1
SELECT d.name, p.name 
FROM department d 
JOIN people p ON p.department_id = d.id 

Ich empfehle auch ein SQL Join tutorial oder drei zu lesen. Dies ist ein sehr allgemeines und sehr grundlegendes SQL-Konzept, das Sie gründlich verstehen sollten.

+0

Das war ein Softball, oder? – JohnFx

0

Diese normalerweise in einer einzigen Abfrage durchgeführt wird:

SELECT DepartmentTable.Name, People.Name from DepartmentTable 
INNER JOIN People 
ON DepartmentTable.id = People.department_id 
ORDER BY DepartmentTable.Name 

Dies unterdrückt leere Abteilungen.Wenn Sie leere Abteilungen anzeigen möchten, ändern Sie INNER zu LEFT OUTER

+0

-1: Diese Abfrage wählt nur Abteilungen aus. – hobodave

+0

Ähm, was? Dies wird alle Spalten aus beiden Tabellen zurückgeben, nein? Aber solange ich hier bin, füge ich ein ORDER BY hinzu und mache die Feldnamen explizit ... – egrunin

Verwandte Themen