Newsgroup: it.comp.software.database
Titolo: Ordinamento risultati

Salve a tutti, ho una query del genere:
SELECT * FROM tab WHERE r1 LIKE '...' OR r2 LIKE '...' OR r3 LIKE '...'
Vorrei che i risultati fossero restituiti in quest'ordine: prima quelli dove
la stringa di ricerca è presente in r1, poi quelli dove è presente in r2, e
infine quelli dove è presente in r3. Cosa mi consigliate ?
Io avevo anche pensato di eseguire 3 query, ma poi c'è il problema di
eliminare i doppioni, visto che la stringa di ricerca può essere presente
in tutti e tre i campi...
Grazie !! :)
-- 
LF


Usa una funzione CASE nella clausola ORDER BY:
SELECT
     *
FROM
     tab
WHERE
     r1 LIKE '...' OR r2 LIKE '...' OR r3 LIKE '...'
ORDER BY
     CASE
          WHEN r1 LIKE '...' THEN 1
          WHEN r2 LIKE '...' THEN 2
          WHEN r3 LIKE '...' THEN 3
     END
Ciao
gmax
-- 
   ____ ____  _____ _   _
  / _  |    \(____ ( \ / )
( (_| | | | / ___ |) X (
  \___ |_|_|_\_____(_/ \_)
(_____|
Sapere, saper fare, fare, far sapere
http://gmax.oltrelinux.com

 Usa una funzione CASE nella clausola ORDER BY:
Grazie, č proprio quello che volevo !! Un'altra cosa: le espressioni LIKE
'...' vengono valutate due volte (una nella clausola WHERE e una in ORDER
BY) ? In tal caso si puň valutarle una volta sola, ad esempio creando una
funzione o qualcosa di simile ?
Grazie mille !! :)
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

 
Comunque la giri, quello che chiedi non si puo' fare.
Per esempio, questo e' un altro modo di realizzare la query:
SELECT
     campo1, campo2, campo3,
     CASE
          WHEN r1 LIKE '...' THEN 1
          WHEN r2 LIKE '...' THEN 2
          WHEN r3 LIKE '...' THEN 3
     END AS ordine
FROM
     tab
WHERE
     r1 LIKE '...' OR r2 LIKE '...' OR r3 LIKE '...'
ORDER BY ordine;
Il problema e' che uno dei r1 LIKE '...' viene valutato in ricerca, per 
restringere il numero dei record da mostrare, il secondo viene valutato 
quando la ricerca e' finita, in fase di ordinamento, e pertanto 
l'assegnazione del risultato di LIKE a una variabile non servirebbe a nulla.
Si potrebbe assegnare il valore di LIKE a una variabile in fase di 
ricerca, ma questo costerebbe moltissimo in efficienza, perche' la 
selezione andrebbe fatat su tutti i record, senza filtro preliminare:
SELECT
     campo1, campo2, campo3,
     CASE
          WHEN r1 LIKE '...' THEN 1
          WHEN r2 LIKE '...' THEN 2
          WHEN r3 LIKE '...' THEN 3
          ELSE 0
     END AS ordine
FROM
     tab
HAVING ordine > 0  -- questo e' inefficiente
ORDER BY ordine;
Se stai cercando l'efficienza, ti do tre consigli:
(1)
Non usare LIKE. E' la ricerca piu' lenta che tu possa fare
Se hai molte ricerche testuali, usa un indice FULLTEXT, se il tuo 
database lo supporta. (Se usi MySQL, la doppia valutazione viene 
effettuata sugli indici, ed e' praticamente indolore)
(2)
Se proprio devi usare LIKE, cerca di usarlo su un campo indicizzato 
includendo l'inizio del campo (LIKE 'abc%'). Se usi un LIKE '%abc%' ti 
trovi con una ricerca sequenziale in tutte le colonne.
(3)
non usare l'operatore OR con campi differenti. Usa invece una UNION.
Per quanto questa query possa sembrare mastodontica, se usata con 
operazioni LIKE 'abc%', e' enormemente piu' veloce della precedente.
SELECT
     campo1, campo2, campo3,
     CASE
          WHEN r1 LIKE '...' THEN 1
          WHEN r2 LIKE '...' THEN 2
          WHEN r3 LIKE '...' THEN 3
     END AS ordine
FROM
     tab
WHERE
     r1 LIKE '...'
UNION
SELECT
     campo1, campo2, campo3,
     CASE
          WHEN r1 LIKE '...' THEN 1
          WHEN r2 LIKE '...' THEN 2
          WHEN r3 LIKE '...' THEN 3
     END AS ordine
FROM
     tab
WHERE
     r2 LIKE '...'
UNION
SELECT
     campo1, campo2, campo3,
     CASE
          WHEN r1 LIKE '...' THEN 1
          WHEN r2 LIKE '...' THEN 2
          WHEN r3 LIKE '...' THEN 3
     END AS ordine
FROM
     tab
WHERE
     r3 LIKE '...'
ORDER BY ordine;


 non usare l'operatore OR con campi differenti. Usa invece una UNION.
Questo è molto interessante... ho guardato il tuo esempio, e secondo me
potrebbe funzionare anche in maniera ancora più semplice:
SELECT * FROM tab WHERE r1 LIKE '...'
UNION
SELECT * FROM tab WHERE r2 LIKE '...'
UNION
SELECT * FROM tab WHERE r3 LIKE '...'
UNION di default elimina i duplicati, e i risultati dovrebbero essere
nell'ordine giusto... che ne dici ?
Grazie ancora, i tuoi consigli sono stati preziosi !!
-- 
LF

 
Prego!
