Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: JOIN - który użyć
Forum PHP.pl > Forum > Bazy danych > MySQL
maciorrus
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.
mar1aczi
Wędka: FULL OUTER JOIN
KR2615
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?
mmmmmmm
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
mar1aczi
@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" sad.gif]

Edit: Szybka edycja, bo pisałem równo z mmmmmmm smile.gif i poprawka błędnej interpretacji.
maciorrus
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!
mmmmmmm
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,...
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.