2010-08-07 13 views
17

Mi piacerebbe creare una query in MySQL che abbia un valore opzionale. Quando viene specificato il valore, la query viene filtrata da quel valore, quando il valore non è tutte le righe vengono restituite. Ecco l'idea:La clausola MySQL dove è uguale a qualsiasi cosa (SELECT * WHERE col = ANY_VALUE)

public function doQuery($item = 'ANY_VALUE') { 
    $query = "SELECT * FROM table WHERE item = ?"; 
    db->fetchAll($query,array($item)) 
    ... 
} 

doQuery(); // Returns everything 
doQuery($item='item1'); // Returns only rows where item = 'item1' 

C'è un modo semplice per fare questo senza creare due stringhe di query a seconda del valore di $ articolo?

+0

Poteva essere formulate utilizzando PHP pure. –

risposta

17

Per quanto ne so, non esiste alcun segnaposto "qualsiasi".

Se è possibile utilizzare LIKE, si potrebbe fare

SELECT * FROM table WHERE item LIKE '%' 

se è possibile aggiungere una condizione, si potrebbe annullare la clausola item in questo modo:

SELECT * FROM table WHERE item = ? OR 1=1 

(non funziona nella vostra esempio, perché stai passando "item" come parametro)

Ecco tutte le opzioni che riesco a vedere - è probabilmente più semplice lavorare con due query, rimuovendo lo WHERE clausola del tutto nel secondo.

Probabilmente funzionerebbe, ma non sono sicuro che sia una buona idea dal punto di vista del database.

public function doQuery($item = 'ANY_VALUE') { 
    $query = "SELECT * FROM table WHERE item = ? OR 1 = ?"; 
    db->fetchAll($query,array($item, ($item == 'ANY_VALUE' ? 1 : 0)) 
    ... 
} 
+0

Idee interessanti. L'idea della clausola LIKE potrebbe funzionare, ma penso che danneggerà le prestazioni. L'aggiunta di un'altra clausola where richiedeva la manipolazione della stringa della query che volevo evitare. Se volessi seguire questa strada, potrei semplicemente aggiungere "item =?" clausola direttamente alla stringa di query ... – user27478

+2

Esteso secondo esempio: SELECT * FROM table WHERE item =? O 1 =? Metti 0 nel secondo parametro se vuoi righe specifiche, o 1 se vuoi tutto – Mchl

+0

I * penso * che MySQL manderà in cortocircuito un'istruzione 'LIKE '%'' in '1 = 1' ... Prova (e dubito che danneggerà molto le prestazioni anche se non è un corto circuito, dal momento che avresti comunque bisogno di una scansione completa della tabella) ... – ircmaxell

-1

Non c'è davvero alcun motivo per farlo con una query. L'esecuzione della query senza la clausola WHERE rende esplicito che si desidera restituire tutte le righe. L'esecuzione con una clausola WHERE rende esplicito che si desidera filtrare le righe.

+1

La query effettivamente eseguita è molto più complicata rispetto all'esempio che ho fornito. Seguendo il principio DRY, non voglio dover mantenere due copie di ciò che è essenzialmente la stessa query (più o meno una clausola where). – user27478

+1

Se ho capito bene, è ancora possibile costruire la query in un posto, ramificando solo se il parametro $ item ha un valore. Non considererei una violazione DRY. – mwittrock

+0

@gerdemb, se una query ha una condizione WHERE, e un'altra no, in nessun caso l'immaginazione può essere considerata 'essenzialmente la stessa query'.È un grosso errore presumere che, poiché il testo di due query diverse è simile, la semantica delle due query è simile. –

3

Il modo migliore per eseguire questa operazione è innanzitutto generare query SQL dal parametro su cui è necessario intervenire e quindi eseguire.

function doQuery($params) { 
    $query = 'SELECT * FROM mytable '; 
    if (is_array($params) // or whatever your condition) { 
     $query .= 'WHERE item = ' . $params[0]; 
    } 
    $query .= ' ;'; 

    // execute generated query 
    execute($query); 
} 
Problemi correlati