Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> 5 LEFT JOIN-ów?
piotrek24
post
Post #1





Grupa: Zarejestrowani
Postów: 47
Pomógł: 0
Dołączył: 22.07.2006

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


Mam tabelę "uzytkownicy" z polami:

uzytkownik_id
uzytkownik_nazwa

oraz tabelę "zadania" z polami

zadanie_id
czynnosc_1
uzytkownik_id_1
czynnosc_2
uzytkownik_id_2
czynnosc_3
uzytkownik_id_3
czynnosc_4
uzytkownik_id_4
czynnosc_5
uzytkownik_id_5

Oczywiście poszczególne czynności mogą wykonywać ci sami bądź różni użytkownicy.

I teraz chcę wyświetlić 1 wiersz z tabeli "zadania" przydzielając każdemu numerowi id użytkownika odpowiednią mu nazwę z tabeli "uzytkownicy". Czy jedynym i najprostszym rozwiązaniem tego problemu jest użycie aż (a może tylko?) 5 złączeń zewnętrznych LEFT JOIN ?

Czyli:

  1. SELECT a.czynnosc_1, a.czynnosc_2, a.czynnosc_3, a.czynnosc_4, a.czynnosc_5, b.uzytkownik_nazwa AS uzytkownik_nazwa_1,
  2. c.uzytkownik_nazwa AS uzytkownik_nazwa_2, d.uzytkownik_nazwa AS uzytkownik_nazwa_3, e.uzytkownik_nazwa
  3. AS uzytkownik_nazwa_4, f.uzytkownik_nazwa AS uzytkownik_nazwa_5
  4. FROM zadania a
  5. LEFT JOIN uzytkownicy b ON a.uzytkownik_id_1 = b.uzytkownik_id
  6. LEFT JOIN uzytkownicy c ON a.uzytkownik_id_2 = c.uzytkownik_id
  7. LEFT JOIN uzytkownicy d ON a.uzytkownik_id_3 = d.uzytkownik_id
  8. LEFT JOIN uzytkownicy e ON a.uzytkownik_id_4 = e.uzytkownik_id
  9. LEFT JOIN uzytkownicy f ON a.uzytkownik_id_5 = f.uzytkownik_id
  10. WHERE zadanie_id = 1
Go to the top of the page
+Quote Post
AxZx
post
Post #2





Grupa: Zarejestrowani
Postów: 1 385
Pomógł: 55
Dołączył: 1.03.2005
Skąd: śląsk

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


a jak bedzie 100 uzytkownikow to co zrobisz?
chyba jest zle baza zaprojektowana.
a moze to specjalnie tak?
Go to the top of the page
+Quote Post
piotrek24
post
Post #3





Grupa: Zarejestrowani
Postów: 47
Pomógł: 0
Dołączył: 22.07.2006

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


Nie, nie będzie 100 użytkowników :-), w jednym wierszu tabeli "zadania" jest zawsze dokładnie 5 użytkowników. Chodzi o to że każde zadanie ma dokładnie 5 etapów, a każdy etap może wykonać inny użytkownik. I zamiast do tabeli "zadania" dodawać pełne nazwy użytkowników dodaje tylko ich numery id i potem pobierając rekord z tabeli "zadania" chcę tym numerom ID użytkowników przyporządkować ich odpowiednie nazwy z tabeli "uzytkownicy".

To zapytanie co jest powyżej jak najbardziej działa i w zasadzie może tak zostać jednak moje pytanie dotyczy tego czy to jest jedyne rozwiązanie? i czy nie da sie tego zrobić np. prościej?.
Go to the top of the page
+Quote Post
cojack
post
Post #4





Grupa: Zarejestrowani
Postów: 898
Pomógł: 80
Dołączył: 31.05.2008

Ostrzeżenie: (20%)
X----


Ehm i na kiego tam left joiny?

Nie testowane bo nie mam gdzie ale patrz:

  1. SELECT * FROM uzytkownicy, zadania WHERE uzytkownik_id_1 = (uzytkownik_id = 1) AND uzytkownik_id_2 = (uzytkownik_id = 2) AND uzytkownik_id_3 = (uzytkownik_id = 3) AND uzytkownik_id_4 = (uzytkownik_id = 4) AND zadanie_id = 1


Jak można było taką tabelę zrobić... toż już przecież lepiej jest zrobić tak:

1 tabela: uzytkownicy
uzytkownik_id | uzytkownik_name

2 tabela: zadania
zadanie_id | użytkownik_id | czynnosc_id

3 tabela: czynnosci
czynnosc_id | czynnosc_name

I wtedy robisz tak:
  1. SELECT * FROM uzytkownicy, zadania, czynnosci WHERE uzytkownik_id.uzytkownicy = uzytkownik_id.zadania AND czynnosc_id.zadania = czynnosc_id.czynnosci AND zadanie_id = 1


i wyswietli Ci wszystkich uzytkownikow o wskazanym id zadania i ich nazwy oraz nazwy czynnosci wykonywanych przy danym id zadania.

Po co sobie życie komplikować?

Ten post edytował webdicepl 5.06.2008, 22:11:06
Go to the top of the page
+Quote Post
piotrek24
post
Post #5





Grupa: Zarejestrowani
Postów: 47
Pomógł: 0
Dołączył: 22.07.2006

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


Pomińmy zmiany w strukturze tabeli, ona taka ma być jak jest i już (IMG:http://forum.php.pl/style_emoticons/default/smile.gif) . Nie będę wyjaśniał dlaczego.

Co do propozycji zapytania to nie za bardzo go rozumiem...
Nie wiem co ma oznaczać zapis: "... uzytkownik_id_1 = (uzytkownik_id = 1)... "

Poza tym skąd ja mam wiedzieć że tam będzie użytkownik o id = 1, 2, 3, 4 i 5 ?, może to być użytkownik o id = 114, id = 568 itd.
Choć nawet jak są tam użytkownicy o numerach 1,2,3,4 i 5 to zapytanie nie działa. Nie powoduje błędu ale i nie zwraca żadnego wyniku
Go to the top of the page
+Quote Post
cojack
post
Post #6





Grupa: Zarejestrowani
Postów: 898
Pomógł: 80
Dołączył: 31.05.2008

Ostrzeżenie: (20%)
X----


  1. SELECT * FROM uzytkownicy, zadania WHERE zadania.uzytkownik_id_1 = (uzytkownicy.uzytkownik_id = 1) AND zadania.uzytkownik_id_2 = (uzytkownicy.uzytkownik_id = 2) AND zadania.uzytkownik_id_3 = (uzytkownicy.uzytkownik_id = 3) AND zadania.uzytkownik_id_4 = (uzytkownicy.uzytkownik_id = 4) AND zadanie_id = 1


@EDIT \/

dobra daje sobie spokój...

Ten post edytował cojack 5.06.2008, 08:30:40
Go to the top of the page
+Quote Post
piotrek24
post
Post #7





Grupa: Zarejestrowani
Postów: 47
Pomógł: 0
Dołączył: 22.07.2006

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


Cytat(cojack @ 4.06.2008, 18:07:50 ) *
zadania.uzytkownik_id_1 = (uzytkownicy.uzytkownik_id = 1)


Taki zapis nie działa i nie wiem w ogóle co chcesz tym uzyskać?
Jak ja tym Twoim zapytaniem mam "odebrać" 5 różnych nazwisk z tabeli użytkownicy?

W wyniku zapytania chcę uzyskać coś takiego:

zadanie_id
czynnosc_1
uzytkownik_nazwa
czynnosc_2
uzytkownik_nazwa
czynnosc_3
uzytkownik_nazwa
czynnosc_4
uzytkownik_nazwa
czynnosc_5
uzytkownik_nazwa

Nie wiem czy dobrze przemyślałeś to co piszesz... albo ja czegoś tutaj kompletnie nie rozumiem.

Ten post edytował piotrek24 5.06.2008, 08:10:18
Go to the top of the page
+Quote Post
Sedziwoj
post
Post #8





Grupa: Zarejestrowani
Postów: 793
Pomógł: 32
Dołączył: 23.11.2006
Skąd: Warszawa

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


@piotrek24
Jak masz źle zrobioną bazę to się potem nie dziw, że wychodzą jakieś głupoty próbując z niej coś pobrać.
Go to the top of the page
+Quote Post
piotrek24
post
Post #9





Grupa: Zarejestrowani
Postów: 47
Pomógł: 0
Dołączył: 22.07.2006

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


Cytat(Sedziwoj @ 5.06.2008, 16:04:14 ) *
@piotrek24
Jak masz źle zrobioną bazę to się potem nie dziw, że wychodzą jakieś głupoty próbując z niej coś pobrać.


Ja tu nikogo nie proszę o ocenę mojej bazy danych. Żadne głupoty mi nie wychodzą i wszystko działa jak należy, ale specem nie jestem i chciałem się poradzić kogoś bardziej doświadczonego czy można by to zapytanie uprościć (choć od początku wydaje mi się że nie).

Tabele napisałem w uproszczeniu, w rzeczywistości wygląda inaczej. Poszczególne czynności nie składają się tylko z jednego pola tylko z kilku a ich liczba zmienia się w zależności od rodzaju czynności, dlatego pomysł cojack-a nie wchodzi w grę. Ale powtarzam, mój problem nie dotyczy budowy tabeli tylko zapytania więc napisałem to w uproszczeniu dla łatwego zrozumienia.

Ten post edytował piotrek24 5.06.2008, 19:55:09
Go to the top of the page
+Quote Post
Sedziwoj
post
Post #10





Grupa: Zarejestrowani
Postów: 793
Pomógł: 32
Dołączył: 23.11.2006
Skąd: Warszawa

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


piotrek24 ty nadal nie rozumiesz o co mi chodzi.
Do tego nie zakładaj nigdy, że obecne rozwiązanie jest najlepsze, a to robisz co do bazy, na pewno nie podamy lepszego rozwiązania jeśli nie znamy specyfiki problemu.
W tym wypadku można było coś zrobić, ale straciło by się pewne informacje, więc na pewno takie rozwiązanie odpadnie. A to przez to, że baza jest źle napisana.

Tak więc zostaje taki dziwoląg, który musi pięć razy złączać.
Go to the top of the page
+Quote Post
nospor
post
Post #11





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




tyle postow o nic (IMG:http://forum.php.pl/style_emoticons/default/winksmiley.jpg) a pytanie bylo takie proste:
Cytat
To zapytanie co jest powyżej jak najbardziej działa i w zasadzie może tak zostać jednak moje pytanie dotyczy tego czy to jest jedyne rozwiązanie? i czy nie da sie tego zrobić np. prościej?.

Odpowiedź: nie, nie da się tego zrobić prościej. Użycie tu 5 left joinow tak jak ty to zrobiles to jedyne sensowne rozwiązanie (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)

edit: choć przepraszam, można by się tu pokusić o widoki
Go to the top of the page
+Quote Post
piotrek24
post
Post #12





Grupa: Zarejestrowani
Postów: 47
Pomógł: 0
Dołączył: 22.07.2006

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


Cytat(nospor @ 6.06.2008, 09:30:29 ) *
Odpowiedź: nie, nie da się tego zrobić prościej. Użycie tu 5 left joinow tak jak ty to zrobiles to jedyne sensowne rozwiązanie (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)


Dzięki, taka odpowiedź mi wystarczy. A o widokach poczytam.
Go to the top of the page
+Quote Post
Sedziwoj
post
Post #13





Grupa: Zarejestrowani
Postów: 793
Pomógł: 32
Dołączył: 23.11.2006
Skąd: Warszawa

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


Cytat(nospor @ 6.06.2008, 09:30:29 ) *
tyle postow o nic (IMG:http://forum.php.pl/style_emoticons/default/winksmiley.jpg) a pytanie bylo takie proste:

Odpowiedź: nie, nie da się tego zrobić prościej. Użycie tu 5 left joinow tak jak ty to zrobiles to jedyne sensowne rozwiązanie (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)

edit: choć przepraszam, można by się tu pokusić o widoki


Chyba trochę za daleko z tą prostotą zaszedłeś, nigdzie nie było na początku napisane o tym że nie można zmieniać struktury bazy, a jakby ją zmienić na pewno dało by się to prościej zrobić.
A wiedzę że też z czytaniem moich postów jest problem, bo nie wprost napisałem, że lepiej się tego nie da zrobić.

A co do widoków (tu dzież zwanych perspektywami, z angielskiego VIEW), to tylko ukryją tą kwerendę, ułatwią jej używanie, ale nie ułatwią bazie pracy.
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.08.2025 - 01:37