2012-10-12 12 views
7

Al momento ho una ricerca che assomiglia a questo:Come posso migliorare il mio LIKE con la ricerca JOIN in mysql?

SELECT s.ID 
    FROM Shoe s 
     INNER JOIN Account a 
      ON s.UserID = a.ID 
     WHERE s.Publish='1' AND 
      (s.Brand LIKE '%$Search%' 
      OR s.Name LIKE '%$Search%' 
      OR s.PrimaryColor LIKE '%$Search%' 
      OR a.User LIKE '%$Search%') 
     ORDER BY s.ID DESC 
LIMIT $offset, $rowsPerPage" 

Questo funziona bene quando faccio una ricerca come "Blue" o "Nike", ma se faccio una ricerca come "Blue Nikes" Nothing ritorna. Dovrei usare FULLTEXT? Come posso migliorare questo? Voglio essere in grado di cercare tutte le colonne che possono riguardare la variabile di ricerca.

+1

Sì, dovresti utilizzare le funzionalità di ricerca full text di MySQL o un indice di ricerca esterno. –

+4

L'utilizzo di caratteri jolly sulla sinistra di LIKE impedirà a MySQL di utilizzare l'indice. A seconda delle tue esigenze, potresti anche guardare qualcosa come Solr. –

+0

@SeanBright Ho provato a utilizzare Match Against con Fulltext e ho ottenuto zero risultati. Continuo a cercare e ho trovato questo: http://stackoverflow.com/questions/5925369/mysql-join-and-match-against-search-fail sembra che non funzioni a causa delle parole "stop". Non sono troppo avanti su mysql quindi perdonami se sono perso. – SReca

risposta

1

Così, dopo fare in giro e testare diverse cose, sono arrivato fino a questo:

"FROM Shoe AS s 
    LEFT JOIN Accounts AS a ON s.UserID = a.ID 
    WHERE (MATCH (s.Brand, s.Name, s.PrimaryColor AGAINST('$Search' IN BOOLEAN MODE) 
     OR MATCH (a.User) AGAINST('$Search' IN BOOLEAN MODE)) 
      AND s.Publish='1' 
    ORDER BY s.ID DESC" 

Questo sembra risolvere il problema che ho menzionato sopra, ora posso effettuare una ricerca come "Blue Nike" e tutti gli elementi relativi al blu & nike appariranno. Non sono sicuro se questo è il modo più efficiente per farlo, ma funziona.

0

Invece di LIKE provare a utilizzare SOUNDEX o entrambi.

In secondo luogo, si consiglia di ottimizzare la query per mantenere la capitalizzazione, per esempio:

(lower(s.Brand) LIKE '%" . strtolower($Search) . "%' 
OR lower(s.Name) LIKE '%" . strtolower($Search) . "%' 
OR lower(s.PrimaryColor) LIKE '%" . strtolower($Search) . "%' 
OR lower(a.User) LIKE '%" . strtolower($Search) . "%') 
+0

Quindi in alto dovrebbe essere qualcosa di simile a 'SELECT s.ID, SOUNDEX (s.Brand), SOUNDEX (s.Name), SOUNDEX (s.PrimaryColor), SOUNDEX (a.User) FROM Shoe s ... '? – SReca

+0

Qualcosa del genere: SELECT * FROM shoe AS s WHERE (s.NAME SOUNDS LIKE 'Nike' O s.NOME LIKE 'Nike%'); –

+0

Ho implementato il tuo suggerimento ma non ho migliorato i risultati. Se cerco un marchio ottengo risultati, se cerco un colore non compare nulla. – SReca