2010-03-15 12 views
10

Lasciatemi quindi prefigurare dicendo che non sono un wizard SQL in alcun modo. Quello che voglio fare è semplice come concetto, ma mi ha presentato una piccola sfida nel tentativo di ridurre al minimo la quantità di query del database che sto eseguendo.Ridurre al minimo le query SQL utilizzando join con la relazione uno-a-molti

Diciamo che ho una tabella dei reparti. All'interno di ciascun dipartimento è presente un elenco di dipendenti.

Qual è il modo più efficiente di elencare tutti i reparti e quali dipendenti sono presenti in ciascun reparto.

Così, per esempio se ho una tabella reparto con:

id name 
1 sales 
2 marketing 

e un tavolo persone con:

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

Qual è la migliore lista modo tutti i dipartimenti e tutti i dipendenti per ciascuna dipartimento in questo modo:

Vendite

  • Tom
  • Bill
  • Rachel

Marketing

  • Jessica
  • John

Fai finta che entrambe le tabelle siano davvero enormi. (Voglio evitare di ottenere un elenco di reparti, quindi eseguire il looping del risultato e fare una singola query per ogni dipartimento). Pensa in modo simile alla selezione degli stati/commenti in un sistema simile a Facebook, quando gli stati e i commenti sono memorizzati in tabelle separate.

+1

+1 per aver tentato di liberarti dalla mentalità ciclica del programmatore imperativo. Ne vale la pena. – spender

risposta

11

È possibile ottenere tutto in una singola query con un semplice join, ad esempio:

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 

Ciò restituisce tutti i dati, ma è un po 'di dolore per consumare, in quanto avrete a iterare comunque attraverso ogni persona. Si può andare oltre e raggrupparli:

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 

Otterrete qualcosa di simile come l'uscita:

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

Questo è esattamente il tipo di cosa di cui avevo bisogno. Grazie per le informazioni su GROUP BY e GROUP_CONCAT in questo caso. Esattamente quello che stavo cercando. – Brian

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

Suggerisco anche di leggere uno SQL Join tutorial o tre. Questo è un concetto SQL molto comune e molto basilare da comprendere a fondo.

+0

Quello era un softball vero? – JohnFx

0

Questo avviene normalmente in una singola query:

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

Questo sopprimerà i dipartimenti vuoti.Se vuoi mostrare i dipartimenti vuoti, cambia INNER a LEFT OUTER

+0

-1: questa query seleziona solo i reparti. – hobodave

+0

Ehm, cosa? Ciò restituirà tutte le colonne da entrambe le tabelle, no? Ma finché sono qui aggiungerò un ORDER BY e renderò espliciti i nomi dei campi ... – egrunin

Problemi correlati