[SQL] Specyficzne sortowanie rekordów

Języki, których efekty są wykonywane po stronie serwera. PHP, ASP czy CGI w połączeniu z bazami danych SQL dają niezwykłe możliwości budowy i zarządzania stron WWW. Tu zadajemy pytania oraz demonstrujemy kod, z którym mamy problem.
MirVanos
Nowy
Nowy
Posty: 26
Rejestracja: pt lip 23, 2004 11:15 am
Lokalizacja: Bytom
Kontakt:

[SQL] Specyficzne sortowanie rekordów

Post autor: MirVanos »

Witam
takie pytanie ...... mam np. query:
[sql]select tytul,autor from ksiazki where lower(tytul) like('%fraza%') or lower(autor) like('%fraza%');[/sql]
teraz potrzebuje aby wyniki były posortowane według takiego schematu :
najpierw te rekordy gdzie znaleziono frazę w tytule, a potem te gdzie była ona w autorze.

Czy da się to wykonać 1 zapytaniem ?

pozdrawiam i liczę na Was :)
viraptor
Zaczyna działać
Zaczyna działać
Posty: 633
Rejestracja: pn cze 28, 2004 12:58 pm
Kontakt:

Re: [SQL] Specyficzne sortowanie rekordów

Post autor: viraptor »

Zrób to w 2 zapytaniach - czas będzie porównywalny do pojedynczego select'a, a na pewno mniejszy niż select + jakiekolwiek sortowanie. (zakładam, że czas wczytania kolejnego rekordu jest minimalny w stosunku do szukania frazy w polu)
Możesz to ew. zrobić funkcjami bazy i kursorem pewnie, ale pewnie na tym też wydajność ucierpi.
MirVanos
Nowy
Nowy
Posty: 26
Rejestracja: pt lip 23, 2004 11:15 am
Lokalizacja: Bytom
Kontakt:

Re: [SQL] Specyficzne sortowanie rekordów

Post autor: MirVanos »

2 zapytania odpadają bo funkcja jest zależna w innych miejscach .......... a nie mogę na razie tego przebudować.
Czy z palca masz jakiś konkretny przykład do funkcji dla postgresa ? może być z błędem .............. :)
viraptor
Zaczyna działać
Zaczyna działać
Posty: 633
Rejestracja: pn cze 28, 2004 12:58 pm
Kontakt:

Re: [SQL] Specyficzne sortowanie rekordów

Post autor: viraptor »

Jeszcze jedno mi przyszło do głowy...
Postgresa nie znam, ale pewnie masz tam unie:
[sql]SELECT coś.id FROM coś WHERE coś.title LIKE '%tekst%' UNION SELECT coś.id FROM coś WHERE coś.author LIKE '%tekst%'[/sql]
Nie wiem, czy to zachowuje kolejność, więc jeśli nie, to robisz tak:
[sql]SELECT 1 AS sorter, coś.id FROM coś WHERE coś.title LIKE '%tekst%' UNION SELECT 2 AS sorter, coś.id FROM coś WHERE posts.body LIKE '%tekst%' ORDER BY sorter[/sql]
Ale w drugim przypadku chyba nie usunie duplikatów, wiec będziesz to musiał sam zrobić (ew. wziąść to jako subquery i przepuścić przez "DISTINCT coś.id")
MirVanos
Nowy
Nowy
Posty: 26
Rejestracja: pt lip 23, 2004 11:15 am
Lokalizacja: Bytom
Kontakt:

Re: [SQL] Specyficzne sortowanie rekordów

Post autor: MirVanos »

Dzięki wielkie !

Kod :
[sql]select distinct(ksiazka_id),tytul,autor,wyd_id,kat_id,dane,isbn,opis,cenad,data_wyd,status,sorter from (
SELECT 1 AS sorter,ksiazka_id,tytul,autor,wyd_id,kat_id,dane,isbn,opis,cenad,data_wyd,status from ksiazki WHERE lower(tytul) LIKE ('%ford%') UNION SELECT 2 AS sorter,ksiazka_id,tytul,autor,wyd_id,kat_id,dane,isbn,opis,cenad,data_wyd,status FROM ksiazki WHERE lower(autor) LIKE ('%ford%') ORDER BY sorter) as w order by w.sorter[/sql]

działa !
wielkie dzięki
ODPOWIEDZ