2010-03-15 10 views
10

Pozwolę sobie więc przedmówić to, mówiąc, że nie jestem kreatora SQL w żaden sposób. To, co chcę zrobić, jest proste jako koncepcja, ale przedstawiłem mi małe wyzwanie, gdy próbuję zminimalizować ilość wykonywanych przeze mnie zapytań do bazy danych.Minimalizowanie zapytań SQL przy użyciu łączenia z relacją jeden-do-wielu

Załóżmy, że mam tabelę działów. W każdym dziale jest lista pracowników.

Jaki jest najbardziej efektywny sposób umieszczenia w wykazie wszystkich działów i pracowników w każdym dziale.

Tak na przykład jeśli mam tabeli handlowy z:

id name 
1 sales 
2 marketing 

i stół ludzie z:

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

Jaka jest najlepsza lista sposób wszystkie działy i wszyscy pracownicy dla każdego dział taki jak:

Sprzedaż

  • Tom
  • Bill
  • Rachel

Marketing

  • Jessica
  • John

Udawaj, że obie tabele są w rzeczywistości ogromne. (Nie chcę otrzymywać listy działów, a następnie przechodzić przez wynik i wykonywać indywidualne zapytania dla każdego działu). Pomyśl podobnie o wyborze statusów/komentarzy w systemie podobnym do Facebooka, kiedy statusy i komentarze są przechowywane w oddzielnych tabelach.

+1

+1 za próbę uwolnienia się od zapętlonego sposobu myślenia imperatywnego programisty. To jest tego warte. – spender

Odpowiedz

11

można dostać to wszystko w jednym zapytaniu z prostym dołączyć, np:

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 

ta zwraca wszystkie dane, ale jest to trochę uciążliwe spożywać, ponieważ będziesz musiał iteracyjne przez każdą osobę. Można pójść dalej i grupa je razem:

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 

Dostaniesz coś takiego jak wyjścia:

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

To jest dokładnie ten typ rzeczy, których potrzebowałem. Dziękujemy za informacje o GROUP BY i GROUP_CONCAT w tym przypadku. Dokładnie to, czego szukałem. – Brian

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

Proponuję również przeczytać SQL Join tutorial lub trzy. Jest to bardzo powszechna i bardzo podstawowa koncepcja SQL, którą należy dokładnie zrozumieć.

+0

To była softball, nieprawdaż? – JohnFx

0

to zazwyczaj odbywa się w jednym zapytaniu:

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

To zlikwiduje puste działy.Jeśli chcesz pokazać puste działy, zmień INNER na LEFT OUTER

+0

-1: To zapytanie wybiera tylko działy. – hobodave

+0

Um, co? Spowoduje to zwrócenie wszystkich kolumn z obu tabel, nie? Ale dopóki tu będę, dodam ORDER BY i nadaję im nazwy wyraźnie ... – egrunin

Powiązane problemy