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

问题描述:

我正在开发网站的搜索功能。我有一个名为关键字的表格,有两个字段ID和关键字。我有两个单独的搜索查询AND和OR。问题在于AND查询。它没有返回我期望的结果。我没有从SQL查询中获得预期结果

印刷SQL是:

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

返回的计数为0,而如果我代替或执行相同的SQL和返回的计数为1。我期望的计数为1在两种情况下,我需要这样做,因为AND结果将优先于OR结果。

任何意见将不胜感激。

感谢 阿奇

+1

这个条件'场= str1和场= str1!= str2'永远不会发生。因此,你总会得到0的结果。 – NullUserException 2010-09-08 23:35:35

查询不能工作,因为你有一个条件始终设置为false所以没有记录将被选中!

tg_keyword='keyword_1' AND tg_keyword='keyword_2' 

你想做什么?你能发表这张表的专栏吗?

+0

我有一个包含多个具有相同ID的关键字的表格。如何获得同一个ID的多个关键字进行比较,因为搜索结果需要基于搜索阵列中有多少关键字与每个唯一ID的关键字表中的关键字匹配。有任何想法吗? – archiebald 2010-09-08 23:33:29

+0

@archie请编辑您的问题,以包括此澄清。 – 2010-09-08 23:47:02

我不知道你的表是什么样子,以及它们是如何相互关联的,但是这个查询没有任何意义。你在返回关键字是同一件事和另一件事情的行?这不可能。

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

编辑:根据你在下面评论中写道(请编辑您的问题!),你可能在寻找这样的:

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' 

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

看起来不错,我现在就试试看。我会让你知道我如何继续。谢谢。 – archiebald 2010-09-08 23:36:09

+0

在另一条评论中,他表示他将关键字分散在具有相同ID的多行上。如果每行都包含所有关键字,则您的代码有效。 – EboMike 2010-09-09 00:16:05

+0

是的,在给出这个答案之前的评论(我给你的是一个猜测)。 – Wrikken 2010-09-09 08:46:13

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

从逻辑上讲,这同样是问“我有几个朋友的名字是'JACK'和'JILL'”?没有人叫JACK和JI​​LL。

+4

至少,不是来自同一组朋友... – 2010-09-08 23:31:18

+0

@djacobson眨眼;) – NullUserException 2010-09-08 23:35:06

我认为你需要将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' 

基于业务方案的澄清:

我有具有相同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 ...

尝试:

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