Visualizzazione dei risultati da 1 a 8 su 8
  1. #1
    Utente di HTML.it
    Registrato dal
    Sep 2012
    Messaggi
    199

    SELECT WHERE con multipli parametri

    Ciao a tutti.

    Avete presente la ricerca avanzata di molti siti commerciali? In tal caso io dovrei fare proprio una cosa simile.
    Ho 4 valori, devo mettere dentro la query SELECT la possibilità di cercare nella mia tabella i dati richiesti dal form che possono essere 1 solo o 2 o 3 o tutti e 4.
    Ho fatto svariate prove, ma nessuno mi da il risultato che voglio.
    Come potrei fare la query o gestire la cosa?

    Grazie in anticipo per l'aiuto!

    CIAOOOO


  2. #2
    dipende dal linguaggio di programmazione e dal db usato - specificali (come da regolamento)

  3. #3
    Utente di HTML.it
    Registrato dal
    Sep 2012
    Messaggi
    199
    Scusami...dannata fretta!!!

    Database SQL
    Linguaggio PHP

    Grazie!

  4. #4
    Prova così:

    select * from tabella_aaa
    where 1=1
    and case when '&v_param1' is null then '1' else PARAMETRO_1 end= case when '&v_param1' is null then '1' else '&v_param1' end
    and case when '&v_param2' is null then '1' else PARAMETRO_2 end= case when '&v_param2' is null then '1' else '&v_param2' end
    and case when '&v_param3' is null then '1' else PARAMETRO_3 end= case when '&v_param3' is null then '1' else '&v_param3' end
    and case when '&v_param4' is null then '1' else PARAMETRO_4 end= case when '&v_param4' is null then '1' else '&v_param4' end

    e
    - al posto di &v_param... mettere la variabile/valore ricevuto da web
    - al posto di tabella_aaa metti la tua tabella
    - al posto di PARAMETRO_..... metti il nome delle tue colonne/campi

    Ciao
    Mik

  5. #5
    Utente di HTML.it
    Registrato dal
    Sep 2012
    Messaggi
    199
    Grazie Mik...ma non funge!

    Scrivo il codice...avessi sbagliato qualcosa nel scrivere/capire le tue istruzioni:

    Codice PHP:
                $filter_word$_POST['filter_word'] . "%";
                
    $filter_grp$_POST['filter_grp'];
                
    $filter_mark$_POST['filter_mark'];
                
    $filter_type$_POST['filter_type'];

    $result mysql_query("SELECT * FROM finiture WHERE 1=1 
    and case when '
    $filter_word' is null then '1' else fin_nome end= case when '$filter_word' is null then '1' else '$filter_word' end 
    and case when '
    $filter_grp' is null then '1' else fin_grp end= case when '$filter_grp' is null then '1' else '$filter_grp' end 
    and case when '
    $filter_mark' is null then '1' else fin_mark end= case when '$filter_mark' is null then '1' else '$filter_mark' end 
    and case when '
    $filter_type' is null then '1' else fin_type end= case when '$filter_type' is null then '1' else '$filter_word' end"); 
    Cosa ne dite???

  6. #6
    Utente di HTML.it
    Registrato dal
    Sep 2012
    Messaggi
    199
    Ciao nuovamente a tutti.

    anche in questo caso ho risolto molto grossolanamente in questo modo:

    Codice PHP:
        include('../php/connessione.php'); 
        
    mysql_select_db("mob"$con) or die( mysql_error() );
            if (!isset(
    $_POST['filter_word']) || !isset($_POST['filter_grp']) || !isset($_POST['filter_mark']) || !isset($_POST['filter_type']))
            {
                
    $result mysql_query("SELECT * FROM finiture ORDER BY fin_mark ASC, fin_grp ASC LIMIT $inizio$max");
            }
            else
            {
                
    $filter_word$_POST['filter_word'];
                
    $filter_grp$_POST['filter_grp'];
                
    $filter_mark$_POST['filter_mark'];
                
    $filter_type$_POST['filter_type'];
                
                
    //RICERCA SINGOLA FUNZIONANTE

    if (($filter_word!="cerca per parola") xor ($filter_grp!="grp") xor ($filter_mark!="mark") xor ($filter_type!="type"))
                {
                    
    $result mysql_query("SELECT * FROM finiture WHERE fin_file LIKE '%$filter_word%' OR fin_grp='$filter_grp' OR fin_mark='$filter_mark' OR fin_type='$filter_type' ORDER BY fin_mark ASC, fin_grp ASC LIMIT $inizio$max");
                }

                
    //RICERCA X2 FUNZIONANTE 

                
    if ((($filter_word!="cerca per parola") && ($filter_grp!="grp")) xor (($filter_mark!="mark") && ($filter_type!="type")) xor (($filter_word!="cerca per parola") && ($filter_mark!="mark")) xor (($filter_grp!="grp") && ($filter_type!="type")) xor (($filter_word!="cerca per parola") && ($filter_type!="type")) xor (($filter_grp!="grp") && ($filter_mark!="mark")))
                {
                    
    $result mysql_query("SELECT * FROM finiture WHERE (fin_file LIKE '%$filter_word%' AND fin_grp='$filter_grp') OR (fin_mark='$filter_mark' AND fin_type='$filter_type') OR (fin_file LIKE '%$filter_word%' AND fin_mark='$filter_mark') OR (fin_grp='$filter_grp' AND fin_type='$filter_type') OR (fin_file LIKE '%$filter_word%' AND fin_type='$filter_type') OR (fin_grp='$filter_grp' AND fin_mark='$filter_mark')ORDER BY fin_mark ASC, fin_grp ASC LIMIT $inizio$max");
                }

                
    //RICERCA X3 FUNZIONANTE 

                
    if ((($filter_word!="cerca per parola") && ($filter_grp!="grp") && ($filter_mark!="mark")) xor (($filter_word!="cerca per parola") && ($filter_grp!="grp") && ($filter_type!="type")) xor (($filter_type!="type") && ($filter_grp!="grp") && ($filter_mark!="mark")))
                {
                    
    $result mysql_query("SELECT * FROM finiture WHERE (fin_file LIKE '%$filter_word%' AND fin_grp='$filter_grp' AND fin_mark='$filter_mark') OR (fin_file LIKE '%$filter_word%' AND fin_grp='$filter_grp' AND fin_type='$filter_type')  OR (fin_mark='$filter_mark' AND fin_grp='$filter_grp' AND fin_type='$filter_type') ORDER BY fin_mark ASC, fin_grp ASC LIMIT $inizio$max");
                }

                
    //RICERCA X4 FUNZIONANTE 

                
    if (($filter_word!="cerca per parola") && ($filter_grp!="grp") && ($filter_mark!="mark") && ($filter_type!="type"))
                {
                    
    $result mysql_query("SELECT * FROM finiture WHERE (fin_file LIKE '%$filter_word%' AND fin_grp='$filter_grp' AND fin_mark='$filter_mark' AND fin_type='$filter_type') ORDER BY fin_mark ASC, fin_grp ASC LIMIT $inizio$max");
                }

                
    //RICERCA NESSUNO FUNZIONANTE 

                
    if (($filter_word=="cerca per parola") && ($filter_grp=="grp") && ($filter_mark=="mark") && ($filter_type=="type"))
                {
                    
    $result mysql_query("SELECT * FROM finiture ORDER BY fin_mark ASC, fin_grp ASC LIMIT $inizio$max");
                } 
    Come vedete è un gran bel rompicapo...non ho fatto altro che valutare tutte le possibilità e fargliele eseguire ognuna a se stante.
    Cmq, ora posso andare avanti con il mio progetto.
    Tuttavia, se qualcuno mi sa dire un modo migliore, sempre a scopo didattico x me e a x chiunque altro in futuro possa servire, sarò sempre ben lieto di ascoltarlo, provarlo e seguirlo!!!

    Grazie lo stesso a tutti, ciao.

  7. #7
    Ciao,
    ho modificato e testato su mysql la query sotto riportata:

    codice:
    select * from tabella
    where 1=1
    and case when ifnull('v_param1','') ='' then '1' else campo1 end like case when ifnull('v_param1','') ='' then '1' else '%v_param1%' end
    and case when ifnull('v_param2','') ='' then '1' else campo2 end like case when ifnull('v_param2','') ='' then '1' else '%v_param2%' end
    and case when ifnull('v_param3','') ='' then '1' else campo3 end like case when ifnull('v_param3','') ='' then '1' else '%v_param3%' end
    and case when ifnull('v_param4','') ='' then '1' else campo4 end like case when ifnull('v_param4','') ='' then '1' else '%v_param4%' end
    con la modifica "like" funziona anche cercando una parte del valore del campo. Mi hai detto che la prima soluzione non andava bene: qual è l'anomalia? non da risultati, va in errore?
    Con gli "AND", se i parametri vengono tutti valorizzati, il risultato deve soddisfare tutti i parametri
    Se cambi gli "AND" con "OR", se i parametri vengono tutti valorizzati, il risultato soddisferà almeno uno dei parametri

    Prova e fammi sapere
    Ciao
    Mik

  8. #8
    Utente di HTML.it
    Registrato dal
    Sep 2012
    Messaggi
    199
    Ciao Mik!

    Innanzitutto grazie mille per aiutarmi.

    La prima volta non mi restituiva nulla, pagina bianca.

    Ora sto provando quest'ultimo che mi hai dato. Ho sostituito AND con OR, ma non mi effettua nessuna ricerca, cioè mi restituisce tutti i valori.
    Cmq, rispetto al primo, a prima occhiata, sembra avere una logica a me poco più comprensibile.
    Continuo a smanettarci ancora per un poco anche se ho una riserva in merito: ho letto da qualche parte che SQL, in caso di OR, restituisce il primo valore che trova TRUE vanificando quindi il discorso dei risultati multipli, in caso ad esempio che entrambi i valori siano TRUE.

    Grazie ancora...se riesco a risolvere la questione lo posto!

    Ciao

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.