Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> zapytanie skorelowane
muminekSQL
post
Post #1





Grupa: Zarejestrowani
Postów: 11
Pomógł: 0
Dołączył: 17.12.2010

Ostrzeżenie: (0%)
-----


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');

Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 7)
sazian
post
Post #2





Grupa: Zarejestrowani
Postów: 1 045
Pomógł: 141
Dołączył: 19.09.2006
Skąd: B-tów

Ostrzeżenie: (0%)
-----


tutaj raczej trzeba użyć LEFT JOIN
Go to the top of the page
+Quote Post
mmmmmmm
post
Post #3





Grupa: Zarejestrowani
Postów: 1 421
Pomógł: 310
Dołączył: 18.04.2012

Ostrzeżenie: (0%)
-----


Pełną scieżkę zapisuj.
Go to the top of the page
+Quote Post
muminekSQL
post
Post #4





Grupa: Zarejestrowani
Postów: 11
Pomógł: 0
Dołączył: 17.12.2010

Ostrzeżenie: (0%)
-----


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.

Go to the top of the page
+Quote Post
nospor
post
Post #5





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




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.


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
404
post
Post #6





Grupa: Zarejestrowani
Postów: 226
Pomógł: 25
Dołączył: 22.05.2011

Ostrzeżenie: (0%)
-----


Gdybyś potraktował id_do jako "parent" to mógłbyś skorzystać z tego: http://forum.php.pl/index.php?showtopic=80740.

Ten post edytował 404 20.11.2012, 09:28:09
Go to the top of the page
+Quote Post
muminekSQL
post
Post #7





Grupa: Zarejestrowani
Postów: 11
Pomógł: 0
Dołączył: 17.12.2010

Ostrzeżenie: (0%)
-----


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;
Go to the top of the page
+Quote Post
alegorn
post
Post #8





Grupa: Zarejestrowani
Postów: 341
Pomógł: 40
Dołączył: 23.06.2009

Ostrzeżenie: (0%)
-----


tutaj o ile dobrze oceniam drzewo nested set(zbiory zagnieżdżone) było by idealnym rozwiązaniem dla tego typu problemu

j.
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 20.08.2025 - 21:12