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