Я разрабатываю функцию поиска для веб-сайта. У меня есть таблица с именами с двумя идентификаторами полей и ключевым словом. У меня есть два отдельных поисковых запроса для AND и OR. Проблема связана с запросом AND. Он не возвращает результат, который я ожидаю.
Печатный SQL:
SELECT COUNT(DISTINCT tg_id)
FROM tg_keywords
WHERE tg_keyword='keyword_1'
AND tg_keyword='keyword_2'
Возвращаемый счетчик равен 0, тогда как если я выполняю тот же SQL с OR вместо AND, возвращаемое число равно 1. Я ожидал, что счет будет равен 1 в обоих случаях, и мне нужно, чтобы это было так, как результат AND будет иметь приоритет над результатами OR.
Любые советы будут высоко оценены.
Спасибо Archie
Я не знаю, как выглядит ваша таблица и как вещи связаны друг с другом, но этот запрос не имеет смысла. Вы возвращаете строки, где ключевое слово - это одно и другое в одно и то же время? Это невозможно.
У вас, вероятно, есть еще одна таблица, которая ссылается на ключевые слова? Вы должны искать это, используя соединение, и искать оба ключевых слова. Мы могли бы дать вам более точный ответ, если бы вы могли рассказать нам, как выглядят ваши таблицы.
EDIT: на основании того, что вы написали в комментарии ниже (пожалуйста, отредактируйте свой вопрос!!), вы, вероятно, ищете следующее:
SELECT COUNT(DISTINCT tg_id)
FROM tg_keywords AS kw1, tg_keywords AS kw2
WHERE kw1.tg_id = kw2.tg_id
AND kw1.tg_keyword='keyword_1'
AND kw2.tg_keyword='keyword_2'
Он всегда будет возвращать 0, если ключевое слово_1 = keyword_2. tg_keyword может иметь только одно значение, и когда вы говорите "И", вы просите, чтобы оба условия были истинными.
То же самое, логически говоря, спрашивая: "Сколько у меня друзей, чье имя" JACK "и" JILL "? Никто, никто не называется как JACK, так и JILL.
Основываясь на разъяснении ОП:
У меня есть таблица с несколькими ключевыми словами с одним и тем же идентификатором. Как получить более одного ключевого слова по сравнению с одним и тем же идентификатором, так как результаты поиска должны основываться на том, сколько ключевых слов из массива поиска соответствует ключевым словам в таблице ключевых слов из каждого уникального идентификатора. Любые идеи?
Я предполагаю, что вы хотите вернуть результаты поиска на основе ранжирования того, сколько выбранных ключевых слов соответствует этим результатам? Другими словами, является ли поле идентификатора, что несколько ключевых слов используют идентификатор потенциального результата поиска?
Если это так, предполагая, что вы передаете массив ключевых слов формы {k1, k2, k3, k4}
, вы можете использовать такой запрос:
SELECT ID, COUNT(ID) AS ResultRank FROM tg_keywords WHERE tg_keyword IN (k1, k2, k3, k4) GROUP BY ID ORDER BY ResultRank DESC
В этом примере также предполагается, что заданное ключевое слово может появляться в таблицах несколько раз с разными идентификаторами (поскольку ключевое слово может применяться к нескольким результатам поиска). Запрос вернет список идентификаторов в порядке убывания в зависимости от количества раз, когда они появляются с любым из выбранных ключевых слов. В данном примере наивысший ранг для данного идентификатора должен быть 4, то есть ВСЕ ключевые слова применяются к результату с этим идентификатором...
ваш запрос не может работать, потому что у вас есть условие, которое всегда неверно, поэтому запись не будет выбрана!
tg_keyword='keyword_1' AND tg_keyword='keyword_2'
что вы пытаетесь сделать? Не могли бы вы разместить столбцы этой таблицы?
Думаю, вам нужно будет присоединиться к tg_keywords самому себе. Попробуйте поиграть с чем-то вроде
select *
from tg_keywords k1
join tg_keywords k2 on k1.tg_id = k2.tg_id
where k1.tg_keyword = 'keyword_1' and k2.tg_keyword = 'keyword_2'
tg_keyword='keyword_1' AND tg_keyword='keyword_2'
Логически это не может быть правдой, никогда. Это не может быть и то, и другое. Вы имели в виду что-то вроде:
SELECT * FROM keywords
WHERE tg_keyword LIKE '%keyword_1%' OR tg_keyword LIKE '%keyword_2%'
ORDER BY tg_keyword LIKE '%keyword_1%' + tg_keyword LIKE '%keyword_2%' DESC;
Try:
SELECT tg_id
FROM tg_keywords
WHERE tg_keyword in ('keyword_1','keyword_2')
GROUP BY tg_id
HAVING COUNT(DISTINCT tg_keyword) = 2
field=str1 AND field=str2
никогда не может произойти, еслиstr1 != str2
. Таким образом, вы всегда получите 0 результатов.