Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> wyswietlanie danych z dwoch polaczonych tabel, problem przy stronicowaniu.
x11100b
post 11.09.2009, 14:11:08
Post #1





Grupa: Zarejestrowani
Postów: 16
Pomógł: 0
Dołączył: 20.08.2009

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


witam

mam dwie tabele ktore tworze tak:

  1. CREATE TABLE vc_t (id integer PRIMARY KEY NOT NULL AUTO_INCREMENT, txt text, tyt char(255), dat datetime, kat integer, pub BOOLEAN, email char(255))
  2. CREATE TABLE galerie (id integer PRIMARY KEY NOT NULL AUTO_INCREMENT, DATA DATE, id_tekstu integer NOT NULL, zdjecie mediumblob, mini blob , rozszerzenie char(4) ,wys integer, szer integer)


pierwsza to tabela zawierajaca teksty, druga zawiera zdjecia z ktorych kazde przypisane jest do pewnego tekstu.

chce pobrac teksty wraz z identyfikatorami zdjec ktore im odpowiadaja.

bez stronicowania robilem to tak, ze pobieralem teksty (sortowane wedlug ID) wraz z iloscia zdjec do danego tekstu. nastepnie pobieralem zdjecia z tabeli 'galerie' (posortowane wedlug id_tekstu), i nastepnie w petli wyswietlalem tekst, i w dodatkowej petli w petli wyswietlalem odpowiednia ilosc zdjec z drugiego zapytania.

teraz chce zrobic stronicowanie, ilosc zdjec do danego tekstu umiem pobrac - takim zapytaniem:
  1. (
  2. SELECT `vc_t`.`id` AS `id` , COUNT( `galerie`.`id` ) AS 'ilosc', `dat` , `tyt` , `txt`
  3. FROM `galerie` , `vc_t`
  4. WHERE `galerie`.`id_tekstu` = `vc_t`.`id`
  5. AND `pub` = '1'
  6. GROUP BY `vc_t`.`id`
  7. )
  8. UNION (
  9.  
  10. SELECT `vc_t`.`id` AS `id` , 0 AS 'ilosc', `dat` , `tyt` , `txt`
  11. FROM `vc_t`
  12. WHERE `vc_t`.`id` NOT
  13. IN (
  14.  
  15. SELECT `id_tekstu`
  16. FROM `galerie`
  17. )
  18. )
  19. ORDER BY `id` DESC
  20. LIMIT $vc_start, $vc_n


ale nie wiem jak pobrac kolejnym zapytaniem odpowiednio ustawione identyfikatory zdjec?

a moze ktos ma lepszy pomysl jak wyswietlic takie dane z dwoch polaczonych tabel, z uzyciem stronicowania?

pozdrawiam winksmiley.jpg




jeszcze chcialbym napisac, ze wymyslilem takie zapytanie:

  1. SELECT `id` FROM `galerie` WHERE `galerie`.`id_tekstu` IN (SELECT `id` FROM `vc_t` ORDER BY `id` DESC LIMIT 0, 5 ) ORDER BY `id_tekstu` DESC


jednak dostaje taki komunikat o bledzie:

#1235 - This version of MySQL doesn't yet support 'LIMIT & IN/ALL/ANY/SOME subquery'



zrobilem to tak:

  1. SELECT `id`
  2. FROM `galerie`
  3. WHERE `galerie`.`id_tekstu` > (SELECT min( `id` ) FROM `vc_t` ORDER BY `id` DESC LIMIT 0 , 3) AND `galerie`.`id_tekstu` < (SELECT max( `id` ) FROM `vc_t` ORDER BY `id` DESC LIMIT 0 , 3)
  4. ORDER BY `galerie`.`id_tekstu` DESC


jesli ktos ma jakis inny moze lepszy pomysl to bede wdzieczny winksmiley.jpg

pozdrawiam
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 3)
erix
post 11.09.2009, 14:30:22
Post #2





Grupa: Moderatorzy
Postów: 15 467
Pomógł: 1451
Dołączył: 25.04.2005
Skąd: Szczebrzeszyn/Rzeszów




Też miałem taki problem. ;]

A nie lepiej w Twoim przypadku skorzystać z left join...?


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

ZCE :: Pisząc PW załączaj LINK DO TEMATU i TYLKO w sprawach moderacji :: jakiś błąd - a TREŚĆ BŁĘDU? :: nie ponaglaj z odpowiedzią via PW!
Go to the top of the page
+Quote Post
x11100b
post 15.09.2009, 07:40:13
Post #3





Grupa: Zarejestrowani
Postów: 16
Pomógł: 0
Dołączył: 20.08.2009

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


a moglbys podac konkretne zapytanie?

chodzi o to by z tabeli "galerie" wydobyc pola "galerie"."id" z rekordow w ktorych pole "galerie"."id_tekstu" odpowiada "vc_t"."id" z tabeli "vc_t" ale tym ktore sa ograniczone limitem $vc_start , $vc_n

robie to tak:

  1. SELECT `id`
  2. FROM `galerie`
  3. WHERE `galerie`.`id_tekstu` >= (SELECT min( `t`.`id` ) FROM (SELECT `id` FROM `vc_t` ORDER BY `id` DESC LIMIT $vc_start , $vc_n) AS t)
  4. AND `galerie`.`id_tekstu` <= (SELECT max( `tt`.`id` ) FROM (SELECT `id` FROM `vc_t` ORDER BY `id` DESC LIMIT $vc_start , $vc_n) AS tt)
  5. ORDER BY `galerie`.`id_tekstu` DESC


mozesz pokazac prosciej / lepiej / szybciej z uzyciem LEFT JOIN?
Go to the top of the page
+Quote Post
thek
post 15.09.2009, 08:58:07
Post #4





Grupa: Moderatorzy
Postów: 4 362
Pomógł: 714
Dołączył: 12.02.2009
Skąd: Jak się położę tak leżę :D




Zrób LEFT JOIN po polach jak proponuje poprzednik a jako ograniczenie zdjęć w warunku WHERE użyj BETWEEN smile.gif
Sam sobie słownie napisałeś zapytanie jesli się przyjrzysz winksmiley.jpg
"wydobyc pola "galerie"."id"
  1. SELECT galerie.id

z rekordow w ktorych pole "galerie"."id_tekstu" odpowiada "vc_t"."id" z tabeli "vc_t" (w zależności czy teksty są przypisane do galerii czy galeria do tekstów, może być LEFT lub RIGHT JOIN)
  1. FROM galerie LEFT JOIN vc_t ON galerie.id = vc_t.id

ale tym ktore sa ograniczone limitem $vc_start , $vc_n
  1. WHERE galerie.id BETWEEN vc_start AND vc_n

Mam nadzieję, że wiesz jak przesłać zmienne vc_start i vc_n do zapytania smile.gif


--------------------
Najpierw był manual... Jeśli tam nie zawarto słów mądrości to zapytaj wszechwiedzącego Google zadając mu własciwe pytania. A jeśli i on milczy to Twój problem nie istnieje :D
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 Wersja Lo-Fi Aktualny czas: 19.07.2025 - 10:27