Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Problem ze złączeniem tabel (JOIN)
Jarod
post
Post #1





Grupa: Zarejestrowani
Postów: 1 190
Pomógł: 27
Dołączył: 23.04.2005

Ostrzeżenie: (0%)
-----


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
Go to the top of the page
+Quote Post
Norbas
post
Post #2





Grupa: Zarejestrowani
Postów: 100
Pomógł: 1
Dołączył: 6.02.2006

Ostrzeżenie: (0%)
-----


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)
Go to the top of the page
+Quote Post
Jarod
post
Post #3





Grupa: Zarejestrowani
Postów: 1 190
Pomógł: 27
Dołączył: 23.04.2005

Ostrzeżenie: (0%)
-----


@Norbas:

Tak to wiem, że zadziała. Mi chodzi o zastosowanie JOIN'a.
Go to the top of the page
+Quote Post
Norbas
post
Post #4





Grupa: Zarejestrowani
Postów: 100
Pomógł: 1
Dołączył: 6.02.2006

Ostrzeżenie: (0%)
-----


Cytat
Mi chodzi o zastosowanie JOIN'a.

Dlaczego? Wersja 3.x bazy? Cele poznawcze? (IMG:http://forum.php.pl/style_emoticons/default/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)
Go to the top of the page
+Quote Post
Jarod
post
Post #5





Grupa: Zarejestrowani
Postów: 1 190
Pomógł: 27
Dołączył: 23.04.2005

Ostrzeżenie: (0%)
-----


Cytat(Norbas @ 30.05.2007, 17:00:53 ) *
Dlaczego? Wersja 3.x bazy? Cele poznawcze? (IMG:http://forum.php.pl/style_emoticons/default/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?
Go to the top of the page
+Quote Post
Norbas
post
Post #6





Grupa: Zarejestrowani
Postów: 100
Pomógł: 1
Dołączył: 6.02.2006

Ostrzeżenie: (0%)
-----


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ę (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)
Cytat
Wyniki tego zapytania są bardzo dziwne - sprawdzałeś je czy pisałeś z głowy?

Nie sprawdzałem, dlaczego są dziwne?
Go to the top of the page
+Quote Post
Jarod
post
Post #7





Grupa: Zarejestrowani
Postów: 1 190
Pomógł: 27
Dołączył: 23.04.2005

Ostrzeżenie: (0%)
-----


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


Nie gdybaj (IMG:http://forum.php.pl/style_emoticons/default/winksmiley.jpg) tylko sam sprawdź - zobaczysz, że daje błędne wyniki.

Ten post edytował Jarod 30.05.2007, 22:52:03
Go to the top of the page
+Quote Post
Norbas
post
Post #8





Grupa: Zarejestrowani
Postów: 100
Pomógł: 1
Dołączył: 6.02.2006

Ostrzeżenie: (0%)
-----


Cytat

Nie chce mi się. To nie jest mój problem, tylko Twój (IMG:http://forum.php.pl/style_emoticons/default/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
Go to the top of the page
+Quote Post
Sopnet
post
Post #9





Grupa: Zarejestrowani
Postów: 23
Pomógł: 0
Dołączył: 28.03.2004
Skąd: Poznań

Ostrzeżenie: (0%)
-----


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
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 23.12.2025 - 20:31