Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> JOIN - który użyć, INNER, LEFT, czy RIGHT
maciorrus
post
Post #1





Grupa: Zarejestrowani
Postów: 2
Pomógł: 0
Dołączył: 18.03.2014

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


Witam,
Mam następujący problem. Pewnie banał dla doświadczonych MySql-owców, ale ja szukałem po forach i nadal nie potrafię tego zrobić.
Mam trzy tabele:
users (id, imie, nazwisko)
skills (id, name)
rating (id, user_id, skill_id, rating)
Porzebuję zadać zapytanie MySql, żeby wywaliło mi, mówiąc w skrócie, skills-y userów. Problem w tym, że muszą być posortowane wg pola rating (malejąco). Może się zdarzyć, że są userzy, którzy nie mają skillsów i wtedy powinno też wypluć takiego użytkownika, a w polach skill, rating pojawić się wartości null. Czyli np:

Imie Nazwisko Skill Rating
Jan Kowalski szykosc 5
Malgosia Kowalska sila 3
Adam Nieudacznik null null

Myślałem o takim rozwiązaniu:
SELECT users.imie, users.nazwisko, skill.name, rating.rating FROM users INNER JOIN skills INNER JOIN rating ON rating.user_id=users.id AND rating.skill_id=skills.id ORDER BY rating.rating DESC
Działa nieźle, ale nie wyświetla użytkowników bez skilli. Proszę o pomoc. Mam nadzieję, że w miarę dokładnie opisałem o co dokładnie mi chodzi.
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 6)
mar1aczi
post
Post #2





Grupa: Zarejestrowani
Postów: 731
Pomógł: 141
Dołączył: 9.05.2011
Skąd: śląskie

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


Wędka: FULL OUTER JOIN
Go to the top of the page
+Quote Post
KR2615
post
Post #3





Grupa: Zarejestrowani
Postów: 311
Pomógł: 13
Dołączył: 7.05.2007

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


zmień pierwszy INNER JOIN na LEFT OUTER JOIN i powinno być OK

Edit: @mar1aczi a czy FULL OUTER nie będzie pluł niepotrzebnymi rekordami jeśli np. istnieją skille do których nie ma przyporządkowanego żadnego użytkownika?

Ten post edytował KR2615 18.03.2014, 21:21:28
Go to the top of the page
+Quote Post
mmmmmmm
post
Post #4





Grupa: Zarejestrowani
Postów: 1 421
Pomógł: 310
Dołączył: 18.04.2012

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


Jakie FULL?
Ewidentny LEFT
@maciorrus staraj się zaraz po JOIN dawać ON.
Np. FROM users u LEFT JOIN rating r ON r.user_id=u.id LEFT JOIN skills s ON r.skill_id=s.id
No i uzywaj aliasów
Go to the top of the page
+Quote Post
mar1aczi
post
Post #5





Grupa: Zarejestrowani
Postów: 731
Pomógł: 141
Dołączył: 9.05.2011
Skąd: śląskie

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


@KR2615: Będzie, ale tylko wtedy jeśli baza jest niepoprawnie skonstruowana.
[Czy powinny istnieć skille dla użytkowników, których nie ma? <- przepraszam, źle zinterpretowałem tabelę "skills" (IMG:style_emoticons/default/sad.gif) ]

Edit: Szybka edycja, bo pisałem równo z mmmmmmm (IMG:style_emoticons/default/smile.gif) i poprawka błędnej interpretacji.

Ten post edytował mar1aczi 18.03.2014, 21:27:50
Go to the top of the page
+Quote Post
maciorrus
post
Post #6





Grupa: Zarejestrowani
Postów: 2
Pomógł: 0
Dołączył: 18.03.2014

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


Dzięki za pomoc.
Zrobiłem jak mówicie i działa, ale jest jeszcze jeden mankament, o którym nie wspomniałem. Mianowicie muszę szukać userów po nazwisku np i jak wywołałem poniższe zapytanie:
  1. SELECT users.imie, users.nazwisko, skill.name, rating.rating FROM users INNER JOIN rating ON rating.user_id=users.id AND users.nazwisko LIKE '%kowal%' INNER JOIN skills ON rating.skill_id=skills.id ORDER BY rating.rating DESC

działa w następujący sposób:
- Wypluwa na początku wszystkie skille posortowane malejąco Prawidłowo
- Na końcu wypluwa wszystkich użytkowników bez znaczenia czy pasują do users.nazwisko LIKE '%kowal% Błąd

Jakiś pomysł?

Udało mi się:

  1. SELECT users.imie, users.nazwisko, skill.name, rating.rating FROM users INNER JOIN rating ON rating.user_id=users.id INNER JOIN skills ON rating.skill_id=skills.id WHERE users.nazwisko LIKE '%kowal%' ORDER BY rating.rating DESC


Dzięki wszystkim za pomoc!


Ten post edytował maciorrus 19.03.2014, 09:12:35
Go to the top of the page
+Quote Post
mmmmmmm
post
Post #7





Grupa: Zarejestrowani
Postów: 1 421
Pomógł: 310
Dołączył: 18.04.2012

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


Musiałbyś sobie doczytać jaka jest różnica w umieszczaniu warunków filtrujących w JOIN od tych we WHERE. Bo w JOIN też można. Z kilkoma ograniczeniami. Np. nie może to być "pierwsza" tabela, nie może być INNER JOIN,...
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: 12.03.2026 - 01:23