[Oracle,php] between 5 and 10, Union ALL, arrays
ďťż
[Oracle,php] between 5 and 10, Union ALL, arrays Zobacz wiadomości
Cytat
A gdyby tak się wedrzeć na umysłów górę, / Gdyby stanąć na ludzkich myśli piramidzie, / I przebić czołem przesądów chmurę, / I być najwyższą myślą wcieloną. . . Juliusz Słowacki, Kordian
eM. - 25-10-2005 10:58 [Oracle,php] between 5 and 10, Union ALL, arrays
Witam,
pisze jeden z modulow do aplikacji www i napotkalem problem. Aplikacja pisana byla na serwerze testowym z Postgre, serwer docelowy to Oracle. Po przeniesieniu wszystko dziala procz stronicowania wynikow. Nie dziala:
[...] rownum between $offset and ($limit + $offset) [...] rownum between 5 and 15
Jednak w moim przypadku nie potrafie tego zastosowac. Zapytania do bazy przechowuje w tablicy w php, aby pozniej latwo dodac nowe miejsca z ktorych maja wyswietlac sie komentarze:
$selects = array(); $selects["blog_comments"] = "select 'blog-comments' as type, forum.id, forum.create_time, forum.pg_body as body, forum.id_user, sn_user.id_user as usersid, sn_user.nick, blog_entry.id_topic, 'blog_comments.php?blog='|| blog_entry.id_blog || '&entry='||blog_entry.id_blog_entry as url from forum, sn_user, blog_entry where forum.id_user = sn_user.id_user AND (forum.id = blog_entry.id_topic OR forum.parent_id=blog_entry.id_topic) AND forum_id = '-1' AND (wasmoderated is null OR wasmoderated = 'f')";
$selects["photo_comments"] = "select 'photo-comments' as type, forum.id, forum.create_time, forum.pg_body as body, forum.id_user, sn_user.id_user as usersid, sn_user.nick, sn_user_photo.id_topic, 'photo_comments.php?main_page=photos&user='|| sn_user_photo.id_user || '&photo='||sn_user_photo.id_photo as url from forum, sn_user, sn_user_photo where forum.id_user = sn_user.id_user AND (forum.id = sn_user_photo.id_topic OR forum.parent_id=sn_user_photo.id_topic) AND forum.parent_id != '0' AND forum_id = '-2' AND (wasmoderated is null OR wasmoderated = 'f')";
$selects["other_comments"] = "select 'other-comments' as type, forum.id, forum.create_time, forum.pg_body as body, forum.id_user, sn_user.id_user as usersid, sn_user.nick, forum.parent_id, '' as url from forum left join sn_user on forum.id_user = sn_user.id_user where forum_id < '-2' AND (wasmoderated is null OR wasmoderated = 'f')";
Teraz tutaj staralem sie zastosowac to rozwiazanie, ktore znalazlem na podanej wyzej stronie:
$res = $GLOBALS["db"]->Execute("SELECT * FROM (".implode(' UNION ALL ',$selects).") t1 WHERE t1.rownum between $offset and ($limit + $offset)");
Zwraca mi blad:
Fatal error: oci8po error: [1747: ORA-01747: invalid user.table.column, table.column, or column specification ] in EXECUTE("SELECT * FROM (select 'blog-comments' as type, forum.id, forum.create_time ...
Wykonujac to:
$res = $GLOBALS["db"]->Execute(implode(' UNION ALL ',$selects)." AND rownum between $offset and ($limit + $offset)");
nie dostaje bledu, ale z wiadomych przyczyn nie dziala dzielenie wynikow.
Bardzo prosze o pomoc, jak poprawic SELECT * FROM (".implode(' UNION ALL ... aby zadzialalo.
Marcin
Lucyna Witkowska - 25-10-2005 10:58
eM. <adres@email.pl> napisał: > Teraz tutaj staralem sie zastosowac to rozwiazanie, ktore znalazlem na > podanej wyzej stronie:
> $res = $GLOBALS["db"]->Execute("SELECT * FROM (".implode(' UNION ALL > ',$selects).") t1 WHERE t1.rownum between $offset and ($limit + $offset)");
Nie mozna wykonywac na rownum zapytania between, dlatego pseudokolumna rownum z podzapytania musi zmienic sie w normalna kolumne zapytania glownego.
Poniewaz tutaj jest jeszcze dodatkowo UNION to mozna wykonac cos takiego:
select * from (select rownum r, l.* from ( TUTAJ mozna wstawic zapytanie z tabeli selectow ) l) t where r between 2 and 3;
Pozdrowienia, LW
eM. - 27-10-2005 23:55
> Poniewaz tutaj jest jeszcze dodatkowo UNION to mozna wykonac cos > takiego: > > select * > from (select rownum r, l.* from ( > TUTAJ mozna wstawic zapytanie z tabeli selectow > ) l) t > where r between 2 and 3;
Wielkie dzieki, wczoraj o 1 w nocy natrafilem na ten problem i wymieklem. Juz zastosowalem i dziala tak jak powinno.
Decede mihi sole - nie zasłaniaj mi słonca. Gdy kogoś kochasz, jesteś jak stworzyciel świata - na cokolwiek spojrzysz, nabiera to kształtu, wypełnia się barwą, światłem. Powietrze przytula się do ciebie, choćby był mróz, a ty masz w sobie tyle radości, że musisz ją rozdawać wokoło, bo się w tobie nie mieści Hoc fac - tak czyń. A tergo - od tyłu; z tyłu. I czarne włosy posiwieją. Safona