sql JOIN在WHERE上使用boolean

时间:2013-02-12 16:02:21

标签: sql sqlite

首先,请注意我对SQL的经验很少(在本例中为sqlite3),因此即使这个问题的标题也可能是错误的。

假设我有一个笔记表(n),以及这些笔记的关键字表(k),最后是一个将一个或多个关键字与每个笔记相关联的表格({{ 1}})。我想做的是找到每个包含两个(或更多)关键字的注释。

更具体一点,下面(sqlite3)是我设置数据库的方式。

nk

有了这个,我可以用

标记关键字ID为1的注释
CREATE TABLE n(nid integer primary key autoincrement, content);
CREATE TABLE k(kid integer primary key autoincrement, content);
CREATE TABLE nk(nkid integer primary key autoincrement, nid, kid);
INSERT INTO n(content) VALUES ("note 1");
INSERT INTO n(content) VALUES ("note 2");
INSERT INTO k(content) VALUES ("keyword 1");
INSERT INTO k(content) VALUES ("keyword 2");
INSERT INTO nk(nid, kid) VALUES (1, 1);
INSERT INTO nk(nid, kid) VALUES (1, 2);
INSERT INTO nk(nid, kid) VALUES (2, 1);

我的问题是我如何使用关键字ID 1 来获取笔记2.我在网上做了一些搜索,但我担心我的知识不足以想到好的搜索条件。我希望这个网站上有人可以提供帮助 - 重要的是 - 如果这是一个愚蠢的问题我会道歉。

3 个答案:

答案 0 :(得分:1)

如果您只想要包含两个以上关键字的备注,请使用聚合:

select nid
from nk
group by nid
having count(*) >= 2

如果可以在列表中复制关键字,请使用:

having count(distinct nk.kid) >= 2

要获得关键字1和2的注释,请使用:

having max(case when kid = 1 then 1 else 0 end) = 1 and
       max(case when kid = 2 then 1 else 0 end) = 1

在这种情况下,having子句只是在看到其中一个值时创建一个标志。然后逻辑在给定音符的关键字集合中确定是否已经看到该值。

答案 1 :(得分:1)

改善@ GordonLinoff的回答:

select * from n where nid IN 
 (select nid
  from (select * from nk where kid in (1,2)) s
  group by nid
  having count(distinct s.kid) = 2)

这将获得kid匹配1和2的记录,即使其他kid值可能存在(3,4等)。 sqlfiddle here

答案 2 :(得分:0)

select * from n LEFT JOIN nk ON nk.nid = n.nid WHERE nk.kid in (1,2)