2012-10-12 2 views
7

Im Moment habe ich eine Suche, die wie folgt aussieht:Wie kann ich meine LIKE mit JOIN-Suche in MySQL verbessern?

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" 

Dies funktioniert gut, wenn ich eine Suche wie „Blue“ oder „Nikes“ zu tun, aber wenn ich eine Suche wie „Blue Nikes“ nichts kehrt zurück. Sollte ich FULLTEXT verwenden? Wie kann ich das verbessern? Ich möchte in der Lage sein, alle Spalten zu durchsuchen, die sich auf die Suchvariable beziehen können.

+1

Ja, Sie sollten die Volltextsuchfunktionen von MySQL oder einen externen Suchindex verwenden. –

+4

Die Verwendung von Platzhalterzeichen auf der linken Seite des LIKE verhindert, dass MySQL den Index verwendet. Abhängig von Ihren Bedürfnissen können Sie sich auch etwas wie solr ansehen. –

+0

@SeanBright Ich habe versucht, Match Against mit Volltext zu verwenden und habe keine Ergebnisse erhalten. Ich suche weiter und stolperte darüber - http://stackoverflow.com/questions/5925369/mysql-join-and-match-against-search-fail scheint, dass es wegen "stop" Wörtern nicht funktionieren wird. Ich bin nicht zu weit fortgeschritten auf mysql, also vergib mir, wenn ich verloren bin. – SReca

Antwort

1

So nach Herumspielen und verschiedene Dinge zu testen, kam ich mit auf den Punkt:

"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" 

Diese scheint mein Problem zu beheben, das ich oben erwähnt habe, kann ich jetzt eine Suche wie "Blue Nike" machen und alle Artikel im Zusammenhang mit blau & Nike wird auftauchen. Nicht sicher, ob dies der effizienteste Weg ist, aber es funktioniert.

0

Anstatt LIKE versuchen Sie SOUNDEX oder beides.

Zweitens können Sie die Abfrage optimieren wollen Kapitalisierung vorzuweisen, zum Beispiel:

(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

Also an der Spitze sollte es so etwas wie 'SELECT s.ID, SOUNDEX (s.Brand), SOUNDEX (s.Name), SOUNDEX (s.PrimaryColor), SOUNDEX (a.User) FROM Shoe s ... '? – SReca

+0

So etwas wie: SELECT * FROM Schuh AS s WHERE (am Namen SOUNDS WIE 'Nike' ODER am Namen wie 'Nike%'); –

+0

Ich habe Ihren Vorschlag implementiert, aber ich habe die Ergebnisse nicht verbessert. Wenn ich eine Marke suche, habe ich Ergebnisse, wenn ich eine Farbe suche, zeigt nichts. – SReca