【发布时间】:2010-12-10 07:01:54
【问题描述】:
我正在使用 Postgresql。我有一个项目表、一个标签表和一个将许多标签链接到一个项目的表。我需要选择匹配 2 个(或更多)给定标签的项目。
我可以选择与WHERE tag.name IN ('tag1', 'tag2') 匹配的1 个或多个项目在MySQL 中我想我可以说WHERE x IN ALL (y, z),但这似乎不起作用是pgsql。
到目前为止,我最好的方法是使用子查询将两个表连接两次。这显然不会扩展到匹配许多标签,我敢肯定这不是最有效的方法。
SELECT *
FROM item
JOIN (SELECT item.id FROM item
JOIN tagged on tagged.item=item.id
JOIN tag ON tag.id=taged.tag
WHERE tag.name='tagOne') p ON p.id=item.id
JOIN tagged ON tagged.item=item.id
JOIN tag ON tag.id=tagged.tag
WHERE tag.name='tagTwo'`
编辑:我仍在测试,但在子查询中使用它比我上面的尝试效果更好
SELECT item.id, count(tag2) AS relevance
FROM item
JOIN tagged tagged1 ON tagged1.item=item.id
JOIN tag tag1 ON (tag1.id=tagged1.tag AND tag1.name='tag1')
JOIN tagged tagged2 ON tagged2.item=item.id
JOIN tag tag2 ON (tag2.id=tagged2.tag)
WHERE tag2.name IN ('tag2', 'tag3')
GROUP BY item.id
根据要求,这里有一些表定义以供澄清:
CREATE TABLE item (id serial, [...]);
CREATE TABLE tag (id serial, name string UNIQUE);
CREATE TABLE taged (tag int references tag(id), item int references item(id));
【问题讨论】:
-
我不认为
WHERE x IN ALL (y, z)做你在 MySQL 中的想法。您能否提供一个 MySQL 示例,以便我们准确了解您的想法? -
如果添加一些表定义会改善问题,因为表/列命名有点混乱
标签: sql postgresql join