【问题标题】:sql search function issue, LIKE and MATCHsql搜索功能问题,LIKE和MATCH
【发布时间】:2014-06-13 11:16:25
【问题描述】:

我必须解决其他人的代码中的一个问题,即搜索函数返回太多结果,我注意到它使用 MATCH

我的SQL不太好,我把所有的MATCH都改成了LIKE的..

这显然带来了一个错误,我认为它与 AGAINST 有关,我不确定但可能只与 MATCH 一起工作..

这是asp代码中的语句。

    strSQL = ""
        strSQL  = "SELECT 'case-studies' AS pagetype, cs.title AS entrytitle, cs.casestudyid AS id, csi.casestudyimageid AS imageid, csi.imagetitle,  LIKE (cs.title, cs.content) AGAINST ('" & searchfor & "') AS relevance, LIKE (csi.imagetitle) AGAINST ('" & searchfor & "') AS imagerelevance "
        strSQL = strSQL & "FROM casestudies AS cs, casestudiesimages AS csi "
        strSQL = strSQL & "WHERE cs.casestudyid = csi.casestudyid AND cs.modestatus = '1' AND ((LIKE(cs.title, cs.content) AGAINST ('" & searchfor & "' IN BOOLEAN MODE)) OR (LIKE(csi.imagetitle) AGAINST ('" & searchfor & "' IN BOOLEAN MODE)) OR (cs.title like '%" & searchfor & "%') OR (cs.content like '%" & searchfor & "%') OR (csi.imagetitle like '%" & searchfor & "%')) "
        strSQL = strSQL & "UNION ALL "
        strSQL = strSQL & "SELECT 'news' AS pagetype, news.title AS entrytitle, news.newsid AS id, newsimages.newsimageid AS imageid, newsimages.imagetitle, LIKE (news.title, news.content) AGAINST ('" & searchfor & "') AS relevance, LIKE (newsimages.imagetitle) AGAINST ('" & searchfor & "') AS imagerelevance "
        strSQL = strSQL & "FROM news, newsimages "
        strSQL = strSQL & "WHERE news.newsid = newsimages.newsid AND news.modestatus = '1' AND ((LIKE(news.title, news.content) AGAINST ('" & searchfor & "' IN BOOLEAN MODE)) OR (LIKE(newsimages.imagetitle) AGAINST ('" & searchfor & "' IN BOOLEAN MODE)) OR (news.title like '%" & searchfor & "%') OR (news.content like '%" & searchfor & "%') OR (newsimages.imagetitle like '%" & searchfor & "%')) "          
        strSQL = strSQL & "GROUP BY id "
        strSQL = strSQL & "ORDER BY relevance DESC, imagerelevance DESC "

任何人都可以帮助破译这段代码.. 它需要像搜索一样搜索,而不是搜索“他”并获得“帮助”等

谢谢

【问题讨论】:

    标签: sql match sql-like


    【解决方案1】:

    你说的是 LIKE,但你没有将你的 LIKE 与任何东西进行比较,一个有效的 LIKE 语句是

    SELECT *
    FROM CUSTOMERS
    WHERE CUSTOMERNAME LIKE '%' + @Param+ '%'
    

    【讨论】:

    • 好的,我明白你的意思了,我所做的只是将 MATCH 更改为 LIKE,所以我认为这一切都是错误的......问题在于我缺乏 SQL 知识...您可以连续拥有多个 LIKE 吗?
    • 嗨,Paul,是的,您的声明中可以有多个 LIKE。但是你总是必须像上面那样定义它。所以然后你添加AND,然后像...一样的列名,再次以同样的方式:)
    【解决方案2】:

    如果您使用 MyISAM 并且您希望搜索的列上有全文索引,您可以通过使用“MATCH..AGAINST”而不是 LIKE 来避免全表扫描,这样更有效.我已经在 MATCH 合适的地方替换了“LIKEs” - 然后是代码中的 AGAINST。 SQL 的一般规则是,如果要测试的表达式没有通配符(在这种情况下只有 %),请使用 MATCH。

    strSQL  = "SELECT 'case-studies' AS pagetype, cs.title AS entrytitle, 
              cs.casestudyid AS id, csi.casestudyimageid AS imageid, csi.imagetitle,
              MATCH (cs.title, cs.content) AGAINST ('" & searchfor & "') AS relevance, 
              MATCH (csi.imagetitle) AGAINST ('" & searchfor & "') AS imagerelevance "
    strSQL = strSQL & "FROM casestudies AS cs, casestudiesimages AS csi "
    strSQL = strSQL & "WHERE cs.casestudyid = csi.casestudyid AND cs.modestatus = '1' AND
        ((MATCH (cs.title, cs.content) AGAINST ('" & searchfor & "' IN BOOLEAN MODE)) OR
        (MATCH (csi.imagetitle) AGAINST ('" & searchfor & "' IN BOOLEAN MODE)) OR 
        (cs.title LIKE '%" & searchfor & "%') OR (cs.content LIKE '%" & 
         searchfor & "%') OR (csi.imagetitle LIKE '%" & searchfor & "%')) "
    strSQL = strSQL & "UNION ALL "
        strSQL = strSQL & "SELECT 'news' AS pagetype, news.title AS entrytitle, 
            news.newsid AS id, newsimages.newsimageid AS imageid, newsimages.imagetitle, 
            MATCH (news.title, news.content) 
            AGINST ('" & searchfor & "') AS relevance, 
            MATCH (newsimages.imagetitle) 
            AGAINST ('" & searchfor & "') AS imagerelevance "
        strSQL = strSQL & "FROM news, newsimages "
        strSQL = strSQL & "WHERE news.newsid = newsimages.newsid AND news.modestatus = '1'
             AND ((MATCH (news.title, news.content) 
                     AGAINST ('" & searchfor & "' IN BOOLEAN MODE)) OR
            (MATCH (newsimages.imagetitle) AGAINST ('" & searchfor & "' 
            IN BOOLEAN MODE)) OR (news.title LIKE '%" & searchfor & "%') 
            OR (news.content LIKE '%" & searchfor & "%') 
            OR (newsimages.imagetitle LIKE '%" & searchfor & "%')) "          
        strSQL = strSQL & "GROUP BY id "
        strSQL = strSQL & "ORDER BY relevance DESC, imagerelevance DESC "
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-12-25
      • 1970-01-01
      • 2011-07-02
      • 2014-02-11
      • 1970-01-01
      • 1970-01-01
      • 2017-03-15
      相关资源
      最近更新 更多