Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Skomplikowane zapytanie
Bora
post
Post #1





Grupa: Zarejestrowani
Postów: 270
Pomógł: 0
Dołączył: 15.06.2003

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


Moja struktuta bazy:
[sql:1:fb5ad8cc22]
CREATE TABLE `forum_tematy` (
`id` int(5) NOT NULL auto_increment,
`autor` varchar(50) NOT NULL default '',
`tytul` varchar(100) NOT NULL default '',
`tresc` text NOT NULL,
KEY `id` (`id`)
) TYPE=MyISAM AUTO_INCREMENT=37 ;


CREATE TABLE `forum_wpisy` (
`id` int(5) NOT NULL auto_increment,
`forum` int(5) NOT NULL default '0',
`temat` int(5) NOT NULL default '0',
`autor` varchar(50) NOT NULL default '',
`tresc` text NOT NULL,
KEY `id` (`id`)
) TYPE=MyISAM AUTO_INCREMENT=147 ;
[/sql:1:fb5ad8cc22]

chce pobrać jeden wpis z forum_tematy i wszystkie mu odpowiadające wpisy w forum_wpisy. Bazy te są powiacane poprzez forum.tematy.id i forum_wpisy.forum

Próbowałem wiele sposobów jednak żaden nie działa do końca poprawnie.

[sql:1:fb5ad8cc22]
SELECT * FROM forum_tematy LEFT JOIN forum_wpisy on forum_tematy.id = forum_wpisy.temat WHERE forum_tematy.id='10'
[/sql:1:fb5ad8cc22]

podobnie

[sql:1:fb5ad8cc22]
SELECT
t1.*, t2.* FROM forum_tematy t1, forum_wpisy t2 WHERE t1.id='10'
[/sql:1:fb5ad8cc22]

Jak powinno wyglądać poprawne zapytanie (IMG:http://forum.php.pl/style_emoticons/default/questionmark.gif)
Go to the top of the page
+Quote Post
Jabol
post
Post #2





Grupa: Przyjaciele php.pl
Postów: 1 467
Pomógł: 13
Dołączył: 22.02.2003

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


po pierwsze. zmien strukture tabeli. Pole forum umiesc w tabeli forum_tematy.
po drugie w obu tabelach masz pola id, wiec nie wiem jak Cie baza traktuje, ale ja bym Ci poradzil wypisac kazde pole oddzielnie i ewentualnie zaliasowac. A ja to bym zrobil to na chama:[sql:1:92c2212ea6]SELECT forum_wpisy.wszystkie, forum_tematy.pola, forum_tematy.wylistowane FROM forum_tematy CROSS JOIN forum_wpisy HAVING forum_tematy.id = "jakies_tam_id"::INT;[/sql:1:92c2212ea6]Oczywiscie przerob sobie jakies tam id na id i usun definicje typu.
Go to the top of the page
+Quote Post
uboottd
post
Post #3





Grupa: Zarejestrowani
Postów: 384
Pomógł: 0
Dołączył: 3.04.2003
Skąd: Chorzow

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


Cytat
po pierwsze. zmien strukture tabeli. Pole forum umiesc w tabeli forum_tematy.


Po jakiego grzyba ? 8O Dobrze ma. Wlasnie tak powinien to zdefiniowac.

Cytat
po drugie w obu tabelach masz pola id, wiec nie wiem jak Cie baza traktuje, ale ja bym Ci poradzil wypisac kazde pole oddzielnie i ewentualnie zaliasowac.


Jak stosuje * to nie ma znaczenia. Dostanie w wyniku oba pola, tyle ze php je wcisnie do jednego pola w fetch_object/fetch_array, ale fetch_row da je oddzielnie AFAIR.

Bora: Mozesz powiedziec co Ci nie pasuje w tych zapytaniam (no w drugim to moze nie musisz), i jak wygladalby przekladowy wynik ktory chcialbys uzyskac ?
Go to the top of the page
+Quote Post
Bora
post
Post #4





Grupa: Zarejestrowani
Postów: 270
Pomógł: 0
Dołączył: 15.06.2003

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


Jest to forum chce żeby wyświetliło dany temat i wszystkie odpowiwdające mu odpowiedzi.
Podane przezemnie sposoby powodują że to wszystko jest łączone w jeden rekord, a ja chce wszystkie rekordy odpowiadające warunkowi:

forum_tematy.id=$nr
forum_wpisy.forum=forum_tematy.id
Go to the top of the page
+Quote Post
uboottd
post
Post #5





Grupa: Zarejestrowani
Postów: 384
Pomógł: 0
Dołączył: 3.04.2003
Skąd: Chorzow

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


To jednym zapytaniem tego nie zrobisz. W zapytaniu nie mozna nagle zmieniac tabel, czy ilosci/rodzajow rekordow. Wszystkie rekordy ktore zwraca Ci baza danych musza miec dokladnie taka sama postac i ich dane pochodzic z tego samego zrodla. Takze jesli chcesz dostac jeden wiersz odpowiadajacy danym forumu i n-wierszy danych wpisow w tch forumach to to musza byc dwa zapytania.

Jesli koniecznie zalezy Ci na jednym zapytaniu to mozesz sprobowac takie dwa sposoby:

1. Dajesz takie zapytanie jak Twoje pierwsze. Dostajesz n-wiersz odpowiadajacych poszczegolnym wpisom (lub co najmniej jeden jesli nie ma wpisow ale jest forum). Nastepnie pobierasz pierwszy wiersz, wykorzystujesz z niego czesc danych odpowiadajacych o forum, cos tam z nimi robisz, przewijasz wynik na poczatek i wchodzisz do petli wykorzystujacej dane o wpisach w forum po prostu ignorujac nadmiarowe dane.

2. To w zasadzie sa dwa zapytania, tyle ze polaczone w jedno:
[sql:1:91bd3aedf7]
SELECT id, autor, tytul, tresc FROM forum_tematy WHERE id=23
UNION ALL
SELECT id, autor, temat, tresc FROM forum_wpisy WHERE forum=23
[/sql:1:91bd3aedf7]
Oba select musza miec dokladnie taka sama ilosc i typ wartosci zwracanych.

PS. Ale gupio podswielil UNION...
Go to the top of the page
+Quote Post
Jabol
post
Post #6





Grupa: Przyjaciele php.pl
Postów: 1 467
Pomógł: 13
Dołączył: 22.02.2003

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


To jak to ma wygladac? Czyli tutaj pole forum oznacza temat? Ale co w takim razie oznacza pole temat?

Cytat
PS. Ale gupio podswielil UNION...
to ty nie widziales jak on podswietla plppgsql.
Go to the top of the page
+Quote Post
uboottd
post
Post #7





Grupa: Zarejestrowani
Postów: 384
Pomógł: 0
Dołączył: 3.04.2003
Skąd: Chorzow

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


W temacie pola temat pogadaj ze scannerem i jego kula (IMG:http://forum.php.pl/style_emoticons/default/winksmiley.jpg)

Ale Bora wyraznie napisal ze laczy to polem forum i na tym sie oparlem. Co prawda w zapytaniu uzyl pola temat, ale to po prostu niech sie zdecyduje (IMG:http://forum.php.pl/style_emoticons/default/winksmiley.jpg)
Go to the top of the page
+Quote Post

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

 



RSS Aktualny czas: 22.08.2025 - 12:57