Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Zapytanie pomiędzy dwoma tabelami
Forum PHP.pl > Forum > Bazy danych > MySQL
CzarnyGsm
Witam,

Męczę się z wyświetleniem rekordów z dwóch różnych tabel, gdzie niektóre rekordy są powiązane.
Mam dwie tabele:
1. Users
id , login, ...
2. Wallpapers
id, category_id, width, height, user_id, ...

Na podstawie tego chciałbym wyświetlić tapety z tabeli wallpapers dla zadanych parametrów i pobrać przy tym login użytownika z tabeli users, który dodał tapetę. Niestety, ale wiele osób ma już usunięte konto i wiele tapet prowadzi do id użytkowników już nieistniejących.
Poniższe zapytanie wyświetli tylko tapety dla których istnieje użytkownik w tabeli users. Czy da się tak skonstruować zapytanie tak aby dla nie istniejącego id użytkownika do wartości kolumny login przypisywało np. "konto usunięte"? Jeśli tak to jak wyglądałoby takie zapytanie?
  1. SELECT `wallpapers` . * , `users`.`id` AS `id_user` , `users`.`login`
  2. FROM `wallpapers`
  3. INNER JOIN `users` ON wallpapers.user_id = users.id
  4. WHERE (
  5. category_id = '2'
  6. )
  7. AND (
  8. width = '101'
  9. )
  10. AND (
  11. height = '80'
  12. )
  13. ORDER BY `id` DESC



Z góry dziękuję za pomoc.
droslaw
Użyj IF
  1. SELECT `wallpapers` . * , `users`.`id` AS `id_user` , IF(`users`.`id` IS NOT NULL, `users`.`login`, 'Użytkownik usunięty') AS `user_login`
  2. FROM `wallpapers` RIGHT JOIN `users` ON `users`.`id`=`wallpapers`.`user_id` WHERE ...;
CzarnyGsm
No niestety do końca nie chce działać. Mysql wypluwa nadal te same rekordy tzn. rekordy, dla których istnieją w bazie użytkownicy users o zadanym user_id z tabeli wallpapers. Jeżeli usunę RIGHT JOIN `users` ON `wallpapers`.`user_id` = `users`.`id` oraz IF( `users`.`id` IS NOT NULL , `users`.`id` , '0' ) AS `id_user` , IF( `users`.`login` IS NOT NULL , `users`.`login` , 'brak-loginu' ) AS `login_user` wyświetli mi np. 54 rekordy, a dla poniższego zapytania niestety wypluwa 34, co oznacz, że pętla IF nie działa prawidłowo. Dlaczego to zapytanie nie działa tak jak powinno? Zapewne popełniłem jakiś błąd, ale nie mogę znaleźć. Czy warunek w JOIN nie jest przyczyną tego i jak go rozwiązać? Może lepszym wyborem będzie użycie UNION, tylko jak to połączyć?snitch.gif Z góry dziękuję za pomoc.
  1. SELECT `wallpapers`. * , IF( `users`.`id` IS NOT NULL , `users`.`id` , '0' ) AS `id_user` , IF( `users`.`login` IS NOT NULL , `users`.`login` , 'brak-loginu' ) AS `login_user`
  2. FROM `wallpapers`
  3. RIGHT JOIN `users` ON `wallpapers`.`user_id` = `users`.`id`
  4. WHERE (
  5. category_id = '2'
  6. )
  7. AND (
  8. width = '101'
  9. )
  10. AND (
  11. height = '80'
  12. )
  13. ORDER BY `id` DESC
droslaw
Mój błąd powinno być LEFT JOIN:
  1. SELECT `wallpapers` . * , `users`.`id` AS `id_user` , IF(`users`.`id` IS NOT NULL, `users`.`login`, 'Użytkownik usunięty') AS `user_login`
  2. FROM `wallpapers` LEFT JOIN `users` ON `users`.`id`=`wallpapers`.`user_id` WHERE ...;

IF tu nie ma nic do znaczenia, decyduje tylko co wstawić w w danym polu w zależności czy jest spełniony warunek czy nie.
Unie się do tego nie nadają. Służa łączynia wyników zapytań, to znaczy tworzysz unię kilku tabel i dostajesz wyniki tak jakby pochodziły z jednej tabeli.
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.