Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> WHERE IN, wyciąganie w kolejności...
farthing
post 9.10.2007, 10:55:04
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 9.10.2007, 11:33:08
Post #2





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

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


ORDER BY ID questionmark.gif


--------------------
Go to the top of the page
+Quote Post
farthing
post 9.10.2007, 11:52:23
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 9.10.2007, 11:55:17
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 9.10.2007, 14:59:30
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 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 9.10.2007, 17:33:28
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 10.10.2007, 07:56:41
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 10.10.2007, 10:25:02
Post #8





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

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


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
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: 25.07.2025 - 01:53