2010-06-24 2 views
6

Ciao a tutti!Come ignorare una colonna per selezionare distinti in postgresql?

Ho un SQL (vedi sopra) e vorrei sapere come posso essere sicuro di non ottenere il doppio solo per il nome. se un nome appare nel primo Selezionare è il master e deve essere ignorato nelle seguenti selezioni.

"SELECT name, id, 'place' AS tablename FROM places WHERE lower(name) LIKE '".strtolower($needle)."%'" 
    ."UNION SELECT name, id, 'community' AS tablename FROM communities WHERE lower(name) LIKE '".strtolower($needle)."%'" 
    ."UNION SELECT name, id, 'district' AS tablename FROM districts WHERE lower(name) LIKE '".strtolower($needle)."%'" 
    ."UNION SELECT name, id, 'region' AS tablename FROM regions WHERE lower(name) LIKE '".strtolower($needle)."%'" 
    ."UNION SELECT name, id, 'province' AS tablename FROM provinces WHERE lower(name) LIKE '".strtolower($needle)."%'" 
    ."ORDER BY name LIMIT 10" 

questo è il mio SQL.

hai bisogno di ulteriori informazioni?

grazie

+0

Avviso per iniezione SQL! –

+0

è solo per testare come funziona, la sicurezza viene dopo ;-) – helle

+1

potresti dirmi dove è l'iniezione? ora sono al gradino della sicurezza ;-) – helle

risposta

5

DISTINCT

SELECT DISTINCT ON (name) name, id, tablename 
FROM (
    SELECT name, id, 'place' AS ... 
    UNION ... 
    UNION ... 
    UNION ... 
    UNION ...) AS subQuery 
ORDER BY name LIMIT 10 

Basta specificare fare solo distinto sulla name utilizzando la query come un sub-query.

Esegui il limite e l'ordine durante il distinto, altrimenti il ​​distinto potrebbe scartare i duplicati e non rinunciare alle 10 righe complete nell'ordine corretto.

+0

se lo aggiungo a ogni selezione, vengono selezionati diversi tavoli distinti, ma nel sindacato ho i doppi. – helle

+0

Whoops, mancato quello. Prova la nuova query modificata. –

+0

grazie ... ma non funziona affatto :-( Devo usare un alias per la sottoquery ... Seleziona Distinct ... FROM (...) AS subqueryname ORDINA ... ora lavori – helle