首先,请注意我对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.我在网上做了一些搜索,但我担心我的知识不足以想到好的搜索条件。我希望这个网站上有人可以提供帮助 - 重要的是 - 如果这是一个愚蠢的问题我会道歉。
答案 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)