Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP][MySQL]Wybieranie rekordów bez odpowiedników w drugiej tabeli
Forum PHP.pl > Forum > Przedszkole
rytek
Witam!

Mam pewien problem, z którym męczę się od kilku dni i nie mogę znaleźć rozwiązania...

Mam dwie tabele:

tabela segregator:

  1. +--+------+-----------+
  2. | id | tytul | opis_plat |
  3. +--+------+-----------+
  4. | 1 | tytul1| PC |
  5. | 2 | tytul1| PS2 |
  6. | 3 | tytul2| PC |
  7. | 4 | tytul2| PS3 |
  8. | 5 | tytul3| PS3 |
  9. ...


tabela galeria:

  1. +-----------+-------------+-----------+
  2. | album_id | album_title | platforma|
  3. +-----------+-------------+-----------+
  4. | 1 | tytul1 | PS2 |
  5. | 2 | tytul2 | PC |
  6. | 3 | tytul2 | PS3 |
  7. ...


Potrzebuje pobrać wszystkie rekordy, które istnieją w tabeli segregator, a nie posiadają odpowiedników w tabeli galeria, by sprawdzić, dla jakich elementów w segregatorze nie dodałem galerii.
Czyli: powinno zwrócić z tabeli segregator rekordy:
1) rekord o id 1, bo w tabeli galeria nie ma rekordu o platformie: PC (pomimo, że jest rekord o album_title: tytul1).
2) rekord o id 5, bo w tabeli galeria nie ma rekordu o tytule tytul3, czyli nie ma również takiego z platformą PC3.

Czyli rozchodzi się o to, żeby zgadzały się wartości obu pól (tytul=album_title I opis_plat=platforma).

No i mam problem, bo udało mi się zrobić, by pobierało te rekordy, które nie mają galerii odpowiadającej tytułowi. Mój kod wygląda tak:


Czyli przykładowo mam w katalogu 5 elementów o tytule elem1 i 5 różnych platformach (PC, PS3, PS2, PSP, X360) itd. Zwraca prawidłowo. Ale... gdy dodam galerię dla np. elem1 i PS3, nie zwraca mi już żadnego rekordu...

  1. CREATE TEMPORARY TABLE gal
  2. SELECT album_id, album_title, platforma
  3. FROM galeria
  4. GROUP BY galeria.album_title
  5.  
  6. SELECT tab2.tytul, tab2.id, tab2.opis_plat
  7. FROM gal tab1
  8. RIGHT JOIN segregator tab2 ON tab2.tytul=tab1.album_title
  9. WHERE tab1.album_title IS NULL
  10. GROUP BY tab2.tytul

Myślę, że nie zamotałem zbyt mocno...

Proszę o pomoc, bo nie mam pojęcia jak to wykonać....

Pozdrawiam serdecznie, Rytek.
thek
Jak dla mnie to masz źle zaprojektowane tabele. W galeriach nie powinieneś zapisywać tytułu i typu platformy tylko id z tabeli segregator. W obecnej sytuacji bowiem galerie są niejednoznaczne i dlatego łączenie musiało by być po dwóch kolumnach jednocześnie. By wykazać braki w tabeli segregator to od niej musisz wychodzić. Więc ona jest pierwsza i dla niej robisz LEFT JOIN po polu tytułu ORAZ galerii, a potem eliminujesz te które mają po takim połączeniu zerowe galerie... czyli id galerrii jest nullem smile.gif
  1. SELECT s.*, g.* FROM segreg s LEFT JOIN galer g ON s.tytul=g.tytul AND s.platforma=g.platforma WHERE g.id IS NULL
Ja tutaj dałem wyświetlanie wszystkiego byś widział, że tam są NULLe, ale Tobie się rozchodzi jedynie o id z segregatorów czyli stykło by
SELECT s.id smile.gif

EDIT... Małe przejęzyczenie... łączenie nie po tytule i galerii, ale po tytule i platformie, co zresztą widać w kodzie zapytania smile.gif
rytek
Serdecznie dziękuję za pomoc, działa pięknie! smile.gif
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.