Visualizzazione risultati 1 fino 8 di 8
Like Tree1Likes
  • 1 Post By alemoppo

Discussione: Ricerca all'interno di mysql

  1. #1
    Guest

    Predefinito Ricerca all'interno di mysql

    Salve a tutti, sono alle prime armi con mysql e php e volevo ottenere delle informazioni.

    Supponiamo io abbia una tabella utenti nel mio database mysql cosi composta:

    Utenti
    |nome| cognome| username|


    Quando invio una stringa alla pagina php voglio che questa mi esegua una query nel database e mi ricavi gli utenti secondo dei criteri. Se invio la stringa "giorgio" devo avere indietro, possibilmente in ordine, tutti gli utenti che :
    -Si chiamano giorgio o contengono la parola giorgio nel nome
    -Poi quelli che contengono la parola giorgio nell'username
    -Poi quelli che contengono la parola giorgio nel cognome.

    Se inserisco "giorgio rossi":
    -Tutti quelli che hanno il nome che contiene la parola giorgio e il cognome che contiene la parola rossi (e viceversa)
    -Tutti quelli che hanno il nome giorgio
    -Tutti quelli che hanno il cognome giorgio
    -Tutti quelli che hanno il nome rossi
    -Tutti quelli che hanno il cognome rossi
    -Tutti quelli che contengono giorgio o rossi nell'username.

    E nel caso venga inserito "giorgio alberto rossi" voglio che i risultati mi escano con una certa pertinenza.
    E' una cosa fattibile?

  2. #2
    L'avatar di javascripter
    javascripter non è connesso Moderatore
    Data registrazione
    14-02-2010
    Messaggi
    1,114

    Predefinito

    È fattibile, puoi usare la clausola LIKE per fare comparazioni di questo tipo e combinarle con l'operatore logico OR.
    Puoi costruire la query dinamicamente in base a quanti nomi passi nella stringa a php (con get/post, separandoli con explode).

    Ti faccio un esempio:
    Codice PHP:
    $input = "giorgio alberto rossi";
    $names = explode(" ", $input); // = array("giorgio", "alberto", "rossi");
    $fields = array("nome", "cognome", "username"); // i campi da comparare = campi della tabella

    $sql_query = "SELECT * FROM utenti WHERE "; // query da completare

    // itera sui campi
    foreach($fields as $field) {
    // itera sull'input
    foreach($names as $name) {
    $sql_query .= $field . " LIKE '%" . $name . "%' OR ";
    }
    }

    $sql_query = substr($sql_query, 0, -3); // rimuove "OR " alla fine della query

    // ora puoi eseguire la query
    Ovviamente, fai attenzione all'input dell'utente e ricorda di fare l'escape alla stringa per motivi di sicurezza (sql injection).
    Ultima modifica di javascripter : 02-04-2015 alle ore 16.14.19

  3. #3
    Guest

    Predefinito

    Grazie mille! Ora ti chiedo una cosa.. mettiamo il caso che:

    |nome |cognome | username|
    |alberto|rossi | albrossi |
    |alberto|bianchi | albbianchi|

    Se io ricerco la stringa "alberto rossi" estrarrò ovviamente dal database tutti e due i record, però con un ordine casuale giusto? Se io volessi recuperare prima alberto rossi e poi alberto bianchi come potrei fare? Cioè vorrei che alberto rossi avesse una pertinenza maggiore rispetto ad alberto bianchi

  4. #4
    L'avatar di javascripter
    javascripter non è connesso Moderatore
    Data registrazione
    14-02-2010
    Messaggi
    1,114

    Predefinito

    Beh, l'ordine di estrazione credo dipenda dal motore di memorizzazione dei dati ma possiamo assumere che sia casuale.
    In ogni modo dovresti definire una relazione per stabilire chi ha più pertinenza rispetto a qualcun altro.

    Cosa ti fa dire che "alberto rossi" abbia più pertinenza di "alberto bianchi"? Se riesci a definire una funzione che calcola per ogni nome un certo valore numerico (che corrisponde appunto al tuo concetto di pertinenza), puoi successivamente fare il sorting sui dati in base a questo valore.

  5. #5
    Guest

    Predefinito

    Ma se al posto della ricerca con LIKE usassi la FULL TEXT risolverei qualcosa?

  6. #6
    L'avatar di alemoppo
    alemoppo non è connesso Staff AV
    Data registrazione
    24-08-2008
    Residenza
    PU / BO
    Messaggi
    22,064

    Predefinito

    Beh, certamente sì perché puoi ordinare per lo score...
    Non ha molto senso ordinare con il LIKE, o almeno non per la pertinenza: tutti i risultati contengono la parola voluta!

    Ciao!
    Ultima modifica di alemoppo : 02-04-2015 alle ore 21.07.37
    javascripter likes this.

  7. #7
    Guest

    Predefinito

    Ma le ricerche con FULL TEXT in base a cosa funzionano? Cioè io ora ho modificato le mie colonne username, nome, cognome a FULL TEXT, come faccio a fare una ricerca di più parole su più colonne FULL TEXT e far comparire i risultati più pertinenti? Non riesco a capire che query una volta che ho inserito la stringa "alberto rossi" per farmi ritornare prima alberto rossi e poi alberto bianchi

  8. #8
    L'avatar di alemoppo
    alemoppo non è connesso Staff AV
    Data registrazione
    24-08-2008
    Residenza
    PU / BO
    Messaggi
    22,064

    Predefinito

    Beh l'utilizzo non è così immediato come per la LIKE, il database deve essere fatto per supportarle: devi creare l'indice.

    Fai una breve ricerca (ad es su google) per vedere in particolare le procedure da fare: spiegarlo qui è inutile quando ci sono pagine e pagine di siti che spiegano dettagliatamente il tutto.

    Ciao!

Tags for this Thread

Regole di scrittura

  • Non puoi creare nuove discussioni
  • Non puoi rispondere ai messaggi
  • Non puoi inserire allegati.
  • Non puoi modificare i tuoi messaggi
  •