Visualizzazione dei risultati da 1 a 9 su 9
  1. #1

    due problemi con una query mysql

    Ho due problemi con una query di ricerca.
    Sono due cose separate, unisco le richieste in questo unico thread per l'inutilità di inserirne due.

    La query viene fatta per cercare CD che corrispondano a determinati criteri.

    Il primo problema è che ora la query alcune volte mi restituisce lo stesso risultato più volte; per esempio se cerco i CD che contengono musicisti con la lettera 'a' nel nome, supponendo che in un CD con id=20 suonino Angelo, Luca, Ettore e Gaetano, lo stesso CD mi compare in elenco tre volte mentre vorrei scartare i risultati che hanno l'id doppio (ovvero che il CD identificato da id=20 comparisse una sola volta in elenco).

    Il secondo problema riguarda la ricerca unificata su nome e cognome insieme.
    Ora la ricerca viene eseguita solo sul nome o solo sul cognome, quindi se cerco 'Carlo' oppure 'Rossi' separatamente mi trova i CD dove suona Carlo Rossi, ma se cerco 'Carlo Rossi' oppure 'Carlo R' non trova nulla. Ora il pezzo della query interessato è:
    Codice PHP:
    WHERE LOWER(m.nomeLIKE '%$_SESSION[principale]%'
    OR LOWER(m.cognomeLIKE '%$_SESSION[principale]%' "; 
    $_SESSION[principale] è la stringa ricercata, ovviamente trasformata in precedenza tutta in minuscolo.

  2. #2
    Utente di HTML.it L'avatar di nicola75ss
    Registrato dal
    Nov 2004
    Messaggi
    12,923
    Per la ricerca puoi concatenare i campi nome e cognome sui quali andrai a ricercare i valori immessi.

    esempio

    select * from tabella where concat(nome,' ',cognome) like '%carlo rossi%'

    Per evitare di avere più volte gli stessi id puoi raggruppare per l'id stesso.
    Ti consiglio inoltre di guardare sul mauale la funzione group_concat() che in questo caso potrebbe tornarti utile.

    edit. Non ho capito poi perchè utilizzi la funzione lower(). A meno che tu non abbia specificato un collate case sensitive, la ricerca sarà insensibile alla differenza tra maiuscole e minuscole.

  3. #3
    Non ho capito poi perchè utilizzi la funzione lower(). A meno che tu non abbia specificato un collate case sensitive, la ricerca sarà insensibile alla differenza tra maiuscole e minuscole.
    Non so, non ho usato altre funzioni anche perchè la mia conoscenza di mysql è ridotta ai minimi termini. Solo che ho provato a cercare "rOssi", "rossi" e "ROSSI" ed ho visto che i risultati erano diversi, allora ho messo tutto in minuscolo, la stringa di ricerca in php con strtolower ed i campi di ricerca con lower.

    Per la ricerca puoi concatenare i campi nome e cognome sui quali andrai a ricercare i valori immessi. esempio select * from tabella where concat(nome,' ',cognome) like '%carlo rossi%'
    Ho provato a farlo, ma siccome c'è anche la funzione lower credo sia quella a dare problemi, l'accavallarsi di due funzioni.

    Per evitare di avere più volte gli stessi id puoi raggruppare per l'id stesso. Ti consiglio inoltre di guardare sul mauale la funzione group_concat() che in questo caso potrebbe tornarti utile.
    E questa mi sa che devo studiarmela un po'

  4. #4
    Utente di HTML.it L'avatar di nicola75ss
    Registrato dal
    Nov 2004
    Messaggi
    12,923
    Originariamente inviato da giancarlo75
    Non so, non ho usato altre funzioni anche perchè la mia conoscenza di mysql è ridotta ai minimi termini. Solo che ho provato a cercare "rOssi", "rossi" e "ROSSI" ed ho visto che i risultati erano diversi, allora ho messo tutto in minuscolo, la stringa di ricerca in php con strtolower ed i campi di ricerca con lower.
    Scrivi

    show create table nome_tua_tabella

    e posta il risultato. Sicuramente hai un collate _cs

  5. #5
    musicisti CREATE TABLE `musicisti` (
    `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
    `nome` varchar(255) COLLATE utf8_bin NOT NULL,
    `cognome` varchar(255) COLLATE utf8_bin NOT NULL,
    PRIMARY KEY (`id`),
    UNIQUE KEY `nome` (`nome`,`cognome`)
    ) ENGINE=InnoDB AUTO_INCREMENT=22 DEFAULT CHARSET=utf8 COLLATE=utf8_bin

    infatti leggo COLLATE, ora si tratta di toglierlo, se riesco con phpmyadmin

  6. #6
    Utente di HTML.it L'avatar di nicola75ss
    Registrato dal
    Nov 2004
    Messaggi
    12,923
    esegui questa query

    alter table musicisti convert to character set utf8 collate utf8_general_ci

    la ricerca ora sarà case-insensitive.

  7. #7
    per i risultati doppi:

    codice:
    select distinct(quello che cerchi) from ...

  8. #8
    You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'distinct(c.id) FROM cd c INNER JOIN cd_musicisti cd_m ON c.id = cd_m.i' at line 1

    A quanto pare non mi funziona

    Anzi mi devo ravvedere...
    FUNZIONA!!!
    mancava solo una virgola di separazione, errore di sintassi.

    Un problema in meno, grazie.

  9. #9
    esegui questa query alter table musicisti convert to character set utf8 collate utf8_general_ci la ricerca ora sarà case-insensitive.
    Vero, ora ho potuto togliere lower. Mi chiedo come mai avevo creato le tabelle con collate, probabilmente avviene in automatico. Non mi resta che provare a concatenare i campi.
    Grazie.

    ...Ed infatti concat funziona, Rigrazie a quanto pare ho risolto entrambi i problemi

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.