Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: WHERE IN
Forum PHP.pl > Forum > Bazy danych > PostgreSQL
farthing
Witam,
jest taki temat: jeśli wyciągam sobie z tabeli grupę rekordów podając ich ID w odp. kolejności w WHERE id IN (...), to w tejże kolejności postgres zwraca rekordy i b.dobrze, ale jeśli dojdzie do tego mały LEFT OUTER JOIN przy selecie, to już pojawiają się małe przekłamania w kolejności co mi wybitnie nie odpowiada.
Da się to jakoś wymusić co by się nie grzebać dodatkowo w phpie?
tomeksobczak
ORDER BY ID questionmark.gif
farthing
heheh, nie chcę sortować wg ID tylko pobierać wg podanej kolejności, która może się zmieniać.
tomeksobczak
zle zrozumialem ;]
najtje
możesz spróbować tak:

create temp table t1 with oids as select * from tamta_tabela where id in (te tam ids);
i wykonać joina wg przypisanych oids:
select * from t1 left outer join ... order by t1.oid;

Powinno sie udac.

ale się nie uda smile.gif

operator IN nie gwarantuje że wiersze zostaną zwrócone w tej kolejności w jakiej się poda id czy jakiekolwiek atrybuty wg których następuje wyszukiwanie.
mwojcik
Nie wiem czy zadziala w Postgresie, w MS SQL tak.
  1. SELECT * FROM (SELECT tabela1.ID FROM tabela1 LEFT OUTER JOIN tabela2 ON tabel1.ID = tabela2.ID) AS temp ORDER BY ID
farthing
Cytat(najtje @ 9.10.2007, 15:59:30 ) *
operator IN nie gwarantuje że wiersze zostaną zwrócone w tej kolejności w jakiej się poda id czy jakiekolwiek atrybuty wg których następuje wyszukiwanie.


ano właśnie :/ no nic pehap se poradzi...
dzięki wszystkim
najtje
Hej, jeszcze się nie poddałem! smile.gif
Właśnie opracowałem pewien sprytny trick bazujący na wywołaniu funkcji generate_series();
zakładamy że chcemy wyświetlić wiersze "tamtej_tabeli" o ID = 32, 33800, 12 i tylko w tej kolejności:

SELECT * FROM tamta_tabela
JOIN (SELECT a[seq] AS id, seq FROM (SELECT ARRAY[32,33800,12] AS a )AS w, (SELECT generate_series(1,3)AS seq) AS q
) AS x ON x.id=tamta_tabela.id ORDER by x.seq;

Problem może tylko być, że taki SQL (działając ze skryptu php) trzeba uzupełnić w dwóch miejscach: trzeba wpisać w konstruktor tablicy (ARRAY[]) odpowiednie id wierszy oraz mieć obliczoną wielkość tej tablicy aby wpisać do wywołania generate_series() ilość elementów tej tablicy.

Pozdrawiam
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.