Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> WHERE IN, wyciąganie w kolejności...
farthing
post
Post #1





Grupa: Zarejestrowani
Postów: 7
Pomógł: 0
Dołączył: 18.12.2006

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


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?
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 7)
tomeksobczak
post
Post #2





Grupa: Zarejestrowani
Postów: 139
Pomógł: 10
Dołączył: 6.07.2007
Skąd: opole

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


ORDER BY ID (IMG:http://forum.php.pl/style_emoticons/default/questionmark.gif)
Go to the top of the page
+Quote Post
farthing
post
Post #3





Grupa: Zarejestrowani
Postów: 7
Pomógł: 0
Dołączył: 18.12.2006

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


heheh, nie chcę sortować wg ID tylko pobierać wg podanej kolejności, która może się zmieniać.
Go to the top of the page
+Quote Post
tomeksobczak
post
Post #4





Grupa: Zarejestrowani
Postów: 139
Pomógł: 10
Dołączył: 6.07.2007
Skąd: opole

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


zle zrozumialem ;]
Go to the top of the page
+Quote Post
najtje
post
Post #5





Grupa: Zarejestrowani
Postów: 48
Pomógł: 0
Dołączył: 4.10.2007

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


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 (IMG:http://forum.php.pl/style_emoticons/default/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.
Go to the top of the page
+Quote Post
mwojcik
post
Post #6





Grupa: Zarejestrowani
Postów: 69
Pomógł: 0
Dołączył: 22.07.2007

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


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
Go to the top of the page
+Quote Post
farthing
post
Post #7





Grupa: Zarejestrowani
Postów: 7
Pomógł: 0
Dołączył: 18.12.2006

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


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
Go to the top of the page
+Quote Post
najtje
post
Post #8





Grupa: Zarejestrowani
Postów: 48
Pomógł: 0
Dołączył: 4.10.2007

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


Hej, jeszcze się nie poddałem! (IMG:http://forum.php.pl/style_emoticons/default/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
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: 25.08.2025 - 16:28