我有表标签和项目以及第三个表tagitem,它将标签与项目匹配。用户可以转到填充了标签列表的项目页面。单击标签后,会在tagitem表中插入一行,标记该项目。
为防止用户将相同的标记同时应用于某个项目,我希望出现的标记列表可以排除已应用于该项目的标记。所以我认为拉取标签的查询应该有一个条件,它排除已经分配给给定项目的标签。但是,我在这方面遇到了麻烦。
表格是:
标签
id|tag
项
id|item
tagitem
id|tagid|itemid
拉取所有标签的查询只是:
"SELECT * FROM tags"
由于带有与项目匹配的标签信息的表格是tagitem,我加入了它们。我需要弄清楚如何在下面的括号中包含一个粗略描述的条件,该条件排除了tagitem表中有关该项目的条目的任何标记。
SELECT t.*,ti.*
FROM `tags` t
LEFT JOIN `tagitem` ti
on t.id = ti.tagid
WHERE
ti.tagid NOT IN (SELECT * FROM tagitem WHERE itemid = '22')
GROUP BY t.id
据我所知。 (现在我得到一些奇怪的操作数错误。)对于正确的方法做任何建议。谢谢!
答案 0 :(得分:2)
一种方法是通过更改表格并在表格上添加 CONSTRAINT 以使每个项目具有唯一标记,
ALTER TABLE tagitem ADD UNIQUE ti_idx (tagid,itemid)
但是,如果您只在查询中执行此操作,请尝试以下
SELECT a.*
FROM tags a
LEFT JOIN
(
SELECT tagid
FROM tagitem
WHERE itemid = '22'
) b ON a.id = b.tagid
WHERE b.tagid IS NULL
从上面的查询中,当使用NOT IN
(或IN
)时,子查询应该只返回一列,
....
WHERE ti.tagid NOT IN (SELECT tagid FROM tagitem WHERE itemid = '22')