Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: zapytanie skorelowane
Forum PHP.pl > Forum > Bazy danych
muminekSQL
Witam,

piszę jedno z moich pierwszych zapytań skorelowanych i za bardzo nie wiem co robię źle:
  1. SELECT * FROM komentarze nad WHERE id IN ( SELECT id FROM komentarze pod WHERE pod.id_do = nad.id ) OR id_do =0

zapytanie daje wyniki tylko dla drugiego warunku, a to co jest w nawiasie w ogóle nic nie zwraca. Oczekiwanym przeze mnie rezultatem jest zbiór wierszy postaci:

komentarz_glowny 1
komentarz 1 do komentarz_glowny 1
komentarz do komentarza 1 do komentarz_glowny 1
komentarz 2 do komentarz_glowny 1
komentarz do komentarz 2 do komentarz_glowny 1


Efektem finalnym ma być coś jak komentarze np. na onecie tylko, że wszystkie komentarze są widoczne od razu z pod komentarzami.

  1. CREATE TABLE IF NOT EXISTS `komentarze` (
  2. `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT,
  3. `id_do` int(10) UNSIGNED DEFAULT NULL,
  4. `tytul` varchar(200) DEFAULT NULL,
  5. `tresc` text,
  6. PRIMARY KEY (`id`),
  7. KEY `id_do` (`id_do`)
  8. ) ENGINE=InnoDB DEFAULT CHARSET=latin2 AUTO_INCREMENT=5 ;
  9.  
  10.  
  11.  
  12. INSERT INTO `komentarze` (`id`, `id_do`, `tytul`, `tresc`) VALUES
  13. (1, 0, 'test', 'test tresci'),
  14. (2, 1, 'odp do 1', 'tresc...'),
  15. (3, 2, 'do 2', '.....'),
  16. (4, 0, 'glowny', 'test');

sazian
tutaj raczej trzeba użyć LEFT JOIN
mmmmmmm
Pełną scieżkę zapisuj.
muminekSQL
Próbowałem z Joinem, ale nie zwraca prawidłowo posortowanych wyników.

  1. SELECT k2 . * FROM komentarze k, komentarze k2 WHERE ( k.id = k2.id_do OR ( k.id = k2.id AND k.id_do =0 AND k2.id_do =0))



Zapisanie pełnej ścieżki nie wchodzi w grę muszę się trzymać takiego schematu bazy.

nospor
Cytat
Zapisanie pełnej ścieżki nie wchodzi w grę muszę się trzymać takiego schematu bazy.
No to przy takim schemacie bazy nie wyciągniesz tego co chcesz jednym zapytaniem.
404
Gdybyś potraktował id_do jako "parent" to mógłbyś skorzystać z tego: http://forum.php.pl/index.php?showtopic=80740.
muminekSQL
Dzięki 404 pewnie posłużę się tym rozwiązaniem. Wracając do pierwszego pytania. Dlaczego to podzapytanie skorelowane nie zwraca wyniku pomijając warunek ( id_do = 0).

  1. SELECT * FROM komentarze nad WHERE id IN ( SELECT id FROM komentarze pod WHERE pod.id_do = nad.id ) OR id_do =0;
alegorn
tutaj o ile dobrze oceniam drzewo nested set(zbiory zagnieżdżone) było by idealnym rozwiązaniem dla tego typu problemu

j.
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.