【问题标题】:How can I improve my LIKE with JOIN search in mysql?如何通过 mysql 中的 JOIN 搜索改进我的 LIKE?
【发布时间】:2012-10-03 14:59:22
【问题描述】:

我目前的搜索结果如下所示:

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”之类的搜索,则不会返回任何内容。我应该使用FULLTEXT 吗?我该如何改进呢?我希望能够搜索所有可能与搜索变量相关的列。

【问题讨论】:

  • 是的,您应该使用 MySQL 的全文搜索功能或外部搜索索引。
  • 在 LIKE 左侧使用通配符会阻止 MySQL 使用索引。根据您的需要,您可能还会查看 solr 之类的东西。
  • @SeanBright 我尝试将 Match Against 与全文结合使用,结果为零。我进一步搜索并发现了这个 - stackoverflow.com/questions/5925369/… 似乎因为“停止”词而不起作用。我在 mysql 上不太先进,所以如果我迷路了,请原谅我。

标签: php mysql join search sql-like


【解决方案1】:

所以在搞砸并测试了不同的东西之后,我想出了这个:

"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 相关的项目都会显示出来。不确定这是否是最有效的方法,但它确实有效。

【讨论】:

    【解决方案2】:

    尝试使用SOUNDEX 代替LIKE,或同时使用两者。

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

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

    【讨论】:

    • 那么在顶部应该是这样的SELECT s.ID, SOUNDEX(s.Brand), SOUNDEX(s.Name), SOUNDEX(s.PrimaryColor), SOUNDEX(a.User) FROM Shoe s...
    • 类似这样的:SELECT * FROM shoe AS s WHERE (s.Name SOUNDS LIKE 'Nike' OR s.Name LIKE 'Nike%');
    • 我实施了您的建议,但没有改善结果。如果我搜索一个品牌,我会得到结果,如果我搜索一种颜色,则什么都不会显示。
    • 它不会完全解决您的问题,但它可能会通过额外的优化来改进搜索。搜索可能会变得非常复杂,一个简单的 SQL 语句不会一直这样做。考虑使用自动完成,就像这个网站如何通过标签搜索一样。
    猜你喜欢
    • 1970-01-01
    • 2012-09-26
    • 2012-02-13
    • 1970-01-01
    • 2013-07-24
    • 1970-01-01
    • 2016-06-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多