Php 如何在mysql中使用JOIN search提高我的喜好?

Php 如何在mysql中使用JOIN search提高我的喜好?,php,mysql,join,search,sql-like,Php,Mysql,Join,Search,Sql Like,我目前有一个如下搜索: 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 '%$

我目前有一个如下搜索:

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"

当我搜索“Blue”或“Nikes”时,这很好,但如果搜索“Blue Nikes”,则不会返回任何结果。我应该使用
全文
?我该如何改进这一点?我希望能够搜索可能与搜索变量相关的所有列。

而不是像
那样尝试使用,或者两者都使用

其次,您可能希望优化查询以保持资本化,例如:

(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) . "%') 

所以在尝试了不同的东西之后,我想到了这个:

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

这似乎解决了我上面提到的问题,我现在可以进行搜索,例如“Blue Nike”,所有与Blue&Nike相关的项目都会显示出来。不确定这是否是最有效的方法,但它确实有效。

是的,您应该使用MySQL的全文搜索功能或外部搜索索引。使用左侧的通配符等将阻止MySQL使用索引。根据您的需要,您也可以查看类似于solr的内容。@SeanBright我尝试将Match-About与全文一起使用,但结果为零。我进一步搜索了这个,发现了这个——因为“停止”这个词,它似乎不起作用。我在mysql上没有太多进步,所以如果我迷路了,请原谅我。所以在顶部,应该是这样的选择s.ID、SOUNDEX(s.Brand)、SOUNDEX(s.Name)、SOUNDEX(s.PrimaryColor)、SOUNDEX(a.User)FROM Shoe s.。
?类似这样的选择:选择*FROM Shoe AS s AS s WHERE(s.Name听起来像“Nike”或s.Name像“Nike%”);我执行了你的建议,但没有改进结果。如果我搜索一个品牌,我会得到结果,如果我搜索一个颜色,什么都不会显示。这不会完全解决你的问题,但它可能会通过额外的优化来改进搜索。搜索可能会变得非常复杂,而一个简单的SQL语句不会一直这样做。考虑使用自动完成,就像这个站点如何通过标签搜索一样。