我没有从SQL查询中获得预期的结果

时间:2010-09-08 23:24:28

标签: php sql mysql count

我正在为网站开发搜索功能。我有一个名为关键字的表,其中包含两个字段id和keyword。我有两个单独的AND和OR搜索查询。问题在于AND查询。它没有返回我期望的结果。

打印的SQL是:

SELECT COUNT(DISTINCT tg_id) 
FROM tg_keywords 
WHERE tg_keyword='keyword_1' 
  AND tg_keyword='keyword_2'

返回的计数为0,而如果我使用OR而不是AND执行相同的SQL,则返回的计数为1.我预计在两种情况下计数都是1,我需要它以这种方式作为AND结果将优先于OR结果。

非常感谢任何建议。

由于 阿奇

7 个答案:

答案 0 :(得分:2)

我不知道你的桌子是什么样的,以及事情是如何相互关联的,但是这个查询毫无意义。你是在同一时间返回关键字是一件事和另一件事的行吗?那是不可能的。

您可能有另一个链接到关键字的表格?您应该使用联接进行搜索,然后搜索这两个关键字。如果你能告诉我们你的桌子是什么样的话,我们可以给你一个更准确的答案。

编辑:根据您在下面的评论中写的内容(请编辑您的问题!!),您可能正在寻找:

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'

答案 1 :(得分:2)

除非keyword_1 = keyword_2,否则它将始终返回0。 tg_keyword只能有一个值,当你说AND时,你要求两个条件都是真的。

从逻辑上讲,这就像问“我有多少朋友,他们的名字是'JACK'和'JILL'”?没有,没有人被称为JACK和JI​​LL。

答案 2 :(得分:1)

您的查询无法正常工作,因为您的条件始终为false,因此不会选择任何记录!

tg_keyword='keyword_1' AND tg_keyword='keyword_2'
你想做什么?你可以发布这个表的列吗?

答案 3 :(得分: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;

答案 4 :(得分: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'

答案 5 :(得分:1)

基于OP的澄清:

  

我有一个包含多个具有相同ID的关键字的表。如何针对相同的ID比较多个关键字,因为搜索结果需要基于搜索数组中的关键字与每个唯一ID的关键字表中的关键字匹配。有什么想法吗?

我假设您希望根据所选关键字的数量与这些结果匹配的排名返回搜索结果?换句话说,多个关键字是否共享潜在搜索结果的ID的ID字段是什么?

如果是这样,假设您传递了{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

此示例还假设给定的关键字可能会多次出现在表中不同的 ID(因为关键字可能适用于多个搜索结果)。查询将根据它们与任何所选关键字一起出现的次数,按降序返回ID列表。在给定的示例中,给定ID的最高排名应为4,这意味着所有关键字都应用于具有该ID的结果...

答案 6 :(得分:0)

尝试:

SELECT tg_id
FROM tg_keywords 
WHERE tg_keyword in ('keyword_1','keyword_2')
GROUP BY tg_id
HAVING COUNT(DISTINCT tg_keyword) = 2