Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Skomplikowane zapytanie
Forum PHP.pl > Forum > Bazy danych > MySQL
Bora
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 questionmark.gif
Jabol
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.
uboottd
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 ?
Bora
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
uboottd
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...
Jabol
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.
uboottd
W temacie pola temat pogadaj ze scannerem i jego kula 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 winksmiley.jpg
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.