首先,请注意,我对 SQL(本例中为 sqlite3)缺乏经验,因此即使是这个问题的标题也可能措辞不当。
假设我有一个注释表 (n
),以及这些注释的关键字表 (k
),最后是一个关联一个或多个关键字的表每个音符 (nk
)。我想做的是找到每个包含两个(或更多)关键字的注释。
更具体一点,下面(sqlite3)是我设置数据库的方式。
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 来获取标记的笔记
select * from n LEFT JOIN nk ON nk.nid = n.nid WHERE nk.kid=1;
我的问题是如何获得关键字ID为1和2的笔记。我在网上做了一些搜索,但我担心我的知识不足以想到好的搜索术语。我希望这个网站上的人能够提供帮助,而且重要的是,如果这是一个愚蠢的问题,我深表歉意。
最佳答案
改进@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 .
关于sql JOIN 与 WHERE 上的 bool 值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14836568/