Как искать точную строку с помощью MySql Query, которая позволяет избежать расширенных значений?

Мой запрос выглядит

$search_query = db_query("SELECT nd.nid, users.name, nd.type FROM node as nd 
LEFT JOIN node_revisions as nd_rev ON nd_rev.nid = nd.nid AND nd_rev.vid = nd.vid 
LEFT JOIN users ON nd.uid = users.uid 
WHERE nd.status = 1 AND nd_rev.body LIKE LOWER('%node/100%') 
AND nd.nid NOT IN(SELECT DISTINCT nid FROM term_node WHERE tid = 293)");

Этот запрос фактически возвращает все совпадения из поля node_revisions.body, которое включает узел /1000, узел /1001.... И т.д.

Я хочу получить только результат точного соответствия, где это возможно, как

"node/100"
"node/100/"
"/node/100"
"/node/100/"
'node/100'
'node/100/'
'/node/100'
'/node/100/'

и не нравится

"node/1006"
"node/10064/"
"/node/1000"
"/node/10001/"
'node/10023'
'node/1005/'
'/node/1001'
'/node/10069/'

Этот выше запрос возвратил мне результат, который имеет строку, как показано ниже....a href= "/node/1006"

Как избежать подобных ошибок? Пожалуйста помоги..

3 ответа

О, я... У меня есть разрешение для этого.. Я пересмотрел свой запрос, как показано ниже, и он дает мне результат, как ожидалось.

$search_query = db_query("SELECT nd.nid, users.name, nd.type FROM node as nd 
LEFT JOIN node_revisions as nd_rev ON nd_rev.nid = nd.nid AND nd_rev.vid = nd.vid 
LEFT JOIN users ON nd.uid = users.uid 
WHERE nd.status = 1 AND nd_rev.body RLIKE '[[:<:]]" . $search_string . "[[:>:]]' 
AND nd.nid NOT IN(SELECT DISTINCT nid FROM term_node WHERE tid = 293)");

смотреть на

nd_rev.body RLIKE '[[:<:]]" . $search_string . "[[:>:]]'

Это то, что я ожидал


Попробуйте удалить % after 100, чтобы поиск не считал никакой цифры после 100, например:

LOWER('%node/100')


Затем рассмотрим следующее Regular Expression

Пример:

'nd_rev.body' REGEXP "^/?node/100/?$"

licensed under cc by-sa 3.0 with attribution.