Я не получаю ожидаемый результат от запроса SQL

0

Я разрабатываю функцию поиска для веб-сайта. У меня есть таблица с именами с двумя идентификаторами полей и ключевым словом. У меня есть два отдельных поисковых запроса для 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

  • 1
    Это условие field=str1 AND field=str2 никогда не может произойти, если str1 != str2 . Таким образом, вы всегда получите 0 результатов.
Теги:
count

7 ответов

2

Я не знаю, как выглядит ваша таблица и как вещи связаны друг с другом, но этот запрос не имеет смысла. Вы возвращаете строки, где ключевое слово - это одно и другое в одно и то же время? Это невозможно.

У вас, вероятно, есть еще одна таблица, которая ссылается на ключевые слова? Вы должны искать это, используя соединение, и искать оба ключевых слова. Мы могли бы дать вам более точный ответ, если бы вы могли рассказать нам, как выглядят ваши таблицы.

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'
2

Он всегда будет возвращать 0, если ключевое слово_1 = keyword_2. tg_keyword может иметь только одно значение, и когда вы говорите "И", вы просите, чтобы оба условия были истинными.

То же самое, логически говоря, спрашивая: "Сколько у меня друзей, чье имя" JACK "и" JILL "? Никто, никто не называется как JACK, так и JILL.

  • 4
    По крайней мере, не теми же группами друзей ...
  • 0
    @djacobson Wink;)
1

Основываясь на разъяснении ОП:

У меня есть таблица с несколькими ключевыми словами с одним и тем же идентификатором. Как получить более одного ключевого слова по сравнению с одним и тем же идентификатором, так как результаты поиска должны основываться на том, сколько ключевых слов из массива поиска соответствует ключевым словам в таблице ключевых слов из каждого уникального идентификатора. Любые идеи?

Я предполагаю, что вы хотите вернуть результаты поиска на основе ранжирования того, сколько выбранных ключевых слов соответствует этим результатам? Другими словами, является ли поле идентификатора, что несколько ключевых слов используют идентификатор потенциального результата поиска?

Если это так, предполагая, что вы передаете массив ключевых слов формы {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, то есть ВСЕ ключевые слова применяются к результату с этим идентификатором...

1

ваш запрос не может работать, потому что у вас есть условие, которое всегда неверно, поэтому запись не будет выбрана!

tg_keyword='keyword_1' AND tg_keyword='keyword_2'

что вы пытаетесь сделать? Не могли бы вы разместить столбцы этой таблицы?

  • 0
    У меня есть таблица с несколькими ключевыми словами с одинаковым идентификатором. Как я могу получить более одного ключевого слова по сравнению для одного и того же идентификатора, поскольку результаты поиска должны основываться на том, сколько ключевых слов из массива поиска соответствует ключевым словам в таблице ключевых слов из каждого уникального идентификатора. Есть идеи?
  • 0
    @archie Пожалуйста, отредактируйте свой вопрос, чтобы включить это разъяснение.
1

Думаю, вам нужно будет присоединиться к 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'
1
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;
  • 0
    Хорошо выглядит, сейчас попробую. Я дам вам знать, как у меня дела. Благодарю.
  • 0
    В другом комментарии он сказал, что ключевые слова распределены по нескольким строкам с одинаковым идентификатором. Ваш код работает, если в каждой строке объединены все ключевые слова.
Показать ещё 2 комментария
0

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню