проблема с функцией поиска sql, ЛАЙК и СОВПАДЕНИЕ

#sql #match #sql-like

#sql #совпадение #sql-подобный

Вопрос:

Мне пришлось исправить проблему в чужом коде, где функция поиска возвращала слишком много результатов, я заметил, что она использовала MATCH< где LIKE было бы более подходящим.

Я не слишком хорошо разбираюсь в SQL, и я изменил все СОВПАДЕНИЯ на ЛАЙКИ..

Это, очевидно, привело к ошибке, я предполагаю, что это связано с тем, ПРОТИВ чего я не уверен, но может работать только с СОВПАДЕНИЕМ..

Вот инструкция в коде 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 ('" amp; searchfor amp; "') AS relevance, LIKE (csi.imagetitle) AGAINST ('" amp; searchfor amp; "') AS imagerelevance "
        strSQL = strSQL amp; "FROM casestudies AS cs, casestudiesimages AS csi "
        strSQL = strSQL amp; "WHERE cs.casestudyid = csi.casestudyid AND cs.modestatus = '1' AND ((LIKE(cs.title, cs.content) AGAINST ('" amp; searchfor amp; "' IN BOOLEAN MODE)) OR (LIKE(csi.imagetitle) AGAINST ('" amp; searchfor amp; "' IN BOOLEAN MODE)) OR (cs.title like '%" amp; searchfor amp; "%') OR (cs.content like '%" amp; searchfor amp; "%') OR (csi.imagetitle like '%" amp; searchfor amp; "%')) "
        strSQL = strSQL amp; "UNION ALL "
        strSQL = strSQL amp; "SELECT 'news' AS pagetype, news.title AS entrytitle, news.newsid AS id, newsimages.newsimageid AS imageid, newsimages.imagetitle, LIKE (news.title, news.content) AGAINST ('" amp; searchfor amp; "') AS relevance, LIKE (newsimages.imagetitle) AGAINST ('" amp; searchfor amp; "') AS imagerelevance "
        strSQL = strSQL amp; "FROM news, newsimages "
        strSQL = strSQL amp; "WHERE news.newsid = newsimages.newsid AND news.modestatus = '1' AND ((LIKE(news.title, news.content) AGAINST ('" amp; searchfor amp; "' IN BOOLEAN MODE)) OR (LIKE(newsimages.imagetitle) AGAINST ('" amp; searchfor amp; "' IN BOOLEAN MODE)) OR (news.title like '%" amp; searchfor amp; "%') OR (news.content like '%" amp; searchfor amp; "%') OR (newsimages.imagetitle like '%" amp; searchfor amp; "%')) "          
        strSQL = strSQL amp; "GROUP BY id "
        strSQL = strSQL amp; "ORDER BY relevance DESC, imagerelevance DESC "
  

Кто-нибудь может помочь расшифровать этот код.. Ему нужно искать подобное для подобного, в отличие от поиска «он» и получения «справки» и т. Д

Спасибо

Ответ №1:

Вы говорите LIKE, но вы ни с чем не сравниваете свой LIKE, допустимый оператор LIKE

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

Комментарии:

1. Хорошо, я понимаю, что вы имеете в виду, все, что я сделал, это изменил СОВПАДЕНИЕ на LIKE, поэтому я предположил, что все это будет неправильно… Проблема заключается в том, что мне не хватает знаний в SQL… Может ли у вас быть более одного лайка подряд?

2. Привет, Пол, да, в вашем заявлении может быть более одного лайка. Но вам всегда придется определять это, как указано выше. итак, затем вы добавляете И, а затем columnname, как …, таким же образом снова и снова 🙂

Ответ №2:

Если вы используете MyISAM и в столбцах, которые вы хотите найти, есть полнотекстовые индексы, вы можете избежать сканирования всей таблицы, используя «СОПОСТАВЛЕНИЕ …. ПРОТИВ», а не LIKE, что намного эффективнее. Я заменил «лайки» в тех местах, где уместно СОВПАДЕНИЕ, а затем ПРОТИВ в вашем коде. Общее правило для вашего 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 ('" amp; searchfor amp; "') AS relevance, 
          MATCH (csi.imagetitle) AGAINST ('" amp; searchfor amp; "') AS imagerelevance "
strSQL = strSQL amp; "FROM casestudies AS cs, casestudiesimages AS csi "
strSQL = strSQL amp; "WHERE cs.casestudyid = csi.casestudyid AND cs.modestatus = '1' AND
    ((MATCH (cs.title, cs.content) AGAINST ('" amp; searchfor amp; "' IN BOOLEAN MODE)) OR
    (MATCH (csi.imagetitle) AGAINST ('" amp; searchfor amp; "' IN BOOLEAN MODE)) OR 
    (cs.title LIKE '%" amp; searchfor amp; "%') OR (cs.content LIKE '%" amp; 
     searchfor amp; "%') OR (csi.imagetitle LIKE '%" amp; searchfor amp; "%')) "
strSQL = strSQL amp; "UNION ALL "
    strSQL = strSQL amp; "SELECT 'news' AS pagetype, news.title AS entrytitle, 
        news.newsid AS id, newsimages.newsimageid AS imageid, newsimages.imagetitle, 
        MATCH (news.title, news.content) 
        AGINST ('" amp; searchfor amp; "') AS relevance, 
        MATCH (newsimages.imagetitle) 
        AGAINST ('" amp; searchfor amp; "') AS imagerelevance "
    strSQL = strSQL amp; "FROM news, newsimages "
    strSQL = strSQL amp; "WHERE news.newsid = newsimages.newsid AND news.modestatus = '1'
         AND ((MATCH (news.title, news.content) 
                 AGAINST ('" amp; searchfor amp; "' IN BOOLEAN MODE)) OR
        (MATCH (newsimages.imagetitle) AGAINST ('" amp; searchfor amp; "' 
        IN BOOLEAN MODE)) OR (news.title LIKE '%" amp; searchfor amp; "%') 
        OR (news.content LIKE '%" amp; searchfor amp; "%') 
        OR (newsimages.imagetitle LIKE '%" amp; searchfor amp; "%')) "          
    strSQL = strSQL amp; "GROUP BY id "
    strSQL = strSQL amp; "ORDER BY relevance DESC, imagerelevance DESC "