Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: informcje - nowe/przeczytane/brak
Forum PHP.pl > Forum > Bazy danych
TomASS
Cześć.

Mam rekordy "zamówienia", mam do tego dwie tabele.

1. zamowienia_uwagi [ID, ID_zamowienia, Tresc] w relacji wiele do jednego z tabela
  1. zamowienia
(jedno zamówienie może mieć kilka uwag)
2. zamowienia_uwagi_przeczytane [ID, ID_user, ID_uwaga, DataPrzeczytania] w relacji wiele do jednego z zamowienia_uwagi

Mam dwie zmienne $id_user oraz $id_zamowienie.
Chciałbym teraz sprawdzić (najlepiej jednym zapytaniem) status wszystkich uwag do danego zamówienia
1. brak uwag
  1. SELECT count(*) FROM zamowienia_uwagi WHERE ID_zamowienia=$id_zamowienie
musi się równać 0
2. są uwagi przeczytane
  1. SELECT ID FROM zamowienia_uwagi WHERE ID_zamowienia=$id_zamowienie
i "mozolne" sprawdzenie w pętli czy już zalogowany użytkownik ($id_user) widział uwagi
3. jw tylko czy są nieprzeczytane uwagi


Sprawdzanie w 3 pętalch
  1. while(zamowienia){
  2. while(uwagi){
  3. while(przeczytane){
  4. }
  5. }
  6. }

jest chyba kiepskim pomysłem :/ Ma może ktoś pomysł jak po podaniu ID_user oraz ID_zamowienie wyciągnąć czy są uwagi, a jak są to czy są jakieś przeczytane czy nie (nie interesuje mnie treść tych uwag)


Dzięki wielkie


phpion
Pomocne okaże się tutaj pewnie EXISTS oraz NOT EXISTS dla (odpowiednio) uwag przeczytanych oraz nieprzeczytanych. Możesz również użyć LEFT JOIN i jeżeli zamowienia_uwagi_przeczytane.ID będzie NULLem, to oznaczać będzie, że uwaga nie została przeczytana.
TomASS
To dzięki NOT EXISTS mam już tylko dwa zpaytania smile.gif

1. sprawdzam czy są uwagi
2. sprawdzam czy są jakieś nieprzeczytane


Tylko czy EXISTS nie jest po prostu zapytaniem w zapytaniu? i czy nie uzyskam efektu (złożoność obliczeniowa n^2) takiego samego jak

  1. while(uwag){
  2. while(przeczytane){
  3. }
  4. }
phpion
Tak, EXISTS będzie się wykonywał dla każdego rekordu z osobna, ale wbrew pozorom powinien zadziałać w tym przypadku szybciej niż zwykłe złączenie tabel. Jak zresztą sama nazwa wskazuje: EXISTS służy do tego by sprawdzić czy jakiś tam rekord istnieje, a przecież o to Ci chodzi. Nie potrzebujesz łączyć tabel by to sprawdzić.
TomASS
dzięki, przynajmniej ograniczy się ilość zapytań 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.