![]() ![]() |
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. |
|
|
|
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
|
|
|
|
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 |
|
|
|
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 |
|
|
|
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 |
|
|
|
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:
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ę:
Dzięki wszystkim za pomoc! Ten post edytował maciorrus 19.03.2014, 09:12:35 |
|
|
|
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,...
|
|
|
|
![]() ![]() |
|
Aktualny czas: 12.03.2026 - 01:24 |