Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Problem ze złączeniem tabel (JOIN)
Forum PHP.pl > Forum > Bazy danych > MySQL
Jarod
Nie mogę poradzić sobie z pewnym zapytaniem. Użytkownik o numerze account_id=1 należy do Grupy1, natomiast użytkownik o numerze account_id=2 należy do Grupy4 i Grupy5. Oto tabele:

accounts_groups (poniżej przykładowe dane)
  1. account_id | group_id
  2. -------------------------
  3. 1 | 1
  4. 2 | 4
  5. 2 | 5


groups (poniżej przykładowe dane)
  1. group_id | group_name | group_description
  2. ---------------------------------------------------
  3. 1 | Grupa1 | Opis grupy 1
  4. 2 | Grupa2 | Opis grupy 2
  5. 3 | Grupa3 | Opis grupy 3
  6. 4 | Grupa4 | Opis grupy 4
  7. 5 | Grupa5 | Opis grupy 5
  8. 6 | Grupa6 | Opis grupy 6
  9. 7 | Grupa7 | Opis grupy 7


Chcę pobrać spis grup (group_id, group_name, group_description) do których nie należy jeszcze dany użytkownik.

Mam zapytanie:
  1. SELECT groups.group_id, group_name, group_description FROM accounts_groups LEFT JOIN groups ON accounts_groups.group_id<>groups.group_id WHERE accounts_groups.account_id=1;

które nie działa jeśli użytkownik nie należy do żadnej grupy lub należy do kilku. Jeśli użytkownik należy do jednej grupy zwraca poprawne wyniki.

Proszę o pomoc
Norbas
Sprawdź:
  1. SELECT group_id, group_name, group_description
  2. FROM groups WHERE group_id NOT IN (SELECT group_id FROM accounts_groups WHERE account_id=1)
Jarod
@Norbas:

Tak to wiem, że zadziała. Mi chodzi o zastosowanie JOIN'a.
Norbas
Cytat
Mi chodzi o zastosowanie JOIN'a.

Dlaczego? Wersja 3.x bazy? Cele poznawcze? smile.gif
Da się za pomocą JOIN, ale to zapytanie nie będzie wydajne:
  1. SELECT DISTINCT g.group_id, group_name, group_description
  2. FROM groups AS g
  3. JOIN accounts_groups AS ag ON (ag.group_id=g.group_id AND account_id<>1)
Jarod
Cytat(Norbas @ 30.05.2007, 17:00:53 ) *
Dlaczego? Wersja 3.x bazy? Cele poznawcze? smile.gif
Da się za pomocą JOIN, ale to zapytanie nie będzie wydajne:

Cele poznawcze, dopasowanie zapytania pod kątem wydajności (JOINY podobno najszybsze)


Cytat(Norbas @ 30.05.2007, 17:00:53 ) *
  1. SELECT DISTINCT g.group_id, group_name, group_description
  2. FROM groups AS g
  3. JOIN accounts_groups AS ag ON (ag.group_id=g.group_id AND account_id<>1)

Wyniki tego zapytania są bardzo dziwne - sprawdzałeś je czy pisałeś z głowy?
Norbas
Cytat
... dopasowanie zapytania pod kątem wydajności (JOINY podobno najszybsze)

Moim zdaniem pierwsze, które podałem będzie szybsze od dowolnego JOINa o ile indeks jest ustawiony na polu group_id w tabeli groups, ale może się mylę smile.gif
Cytat
Wyniki tego zapytania są bardzo dziwne - sprawdzałeś je czy pisałeś z głowy?

Nie sprawdzałem, dlaczego są dziwne?
Jarod
Cytat(Norbas @ 30.05.2007, 20:38:33 ) *
Nie sprawdzałem, dlaczego są dziwne?


Nie gdybaj winksmiley.jpg tylko sam sprawdź - zobaczysz, że daje błędne wyniki.
Norbas
Cytat
Nie gdybaj winksmiley.jpg tylko sam sprawdź

Nie chce mi się. To nie jest mój problem, tylko Twój smile.gif Domyślam się o co chodzi, zapytanie daje błędne wyniki, gdy do danej grupy nie należy żaden użytkownik. Nie wiem jak to zmienić z wykorzystaniem JOINa
Sopnet
Musialbys do tego uzyc jeszcze tebelki accounts
Cos w stylu:
  1. SELECT costam
  2. FROM accounts LEFT JOIN accounts_groups ON accounts_groups.account_id=accounts.account_id
  3. LEFT JOIN groups ON groups.group_id<>accounts_groups.group_id
  4. WHERE accounts.account_id=1
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.