0

我有表标签和项目以及将标签与项目匹配的第三个表 tagitem。用户可以转到填充有标签列表的项目页面。单击标记后,将在 tagitem 表中插入一行,标记该项目。

为了防止用户两次将相同的标签应用于一个项目,我希望出现的标签列表排除任何已应用于该项目的标签。所以我认为提取标签的查询应该有一个条件,排除已经分配给给定项目的标签。但是,我在这样做时遇到了麻烦。

表格是:

标签

id|tag

项目

id|item

标记项目

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

这是我所得到的。(现在我遇到了一些奇怪的操作数错误。)将不胜感激有关正确方法的任何建议。谢谢!

4

1 回答 1

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 ININ)时,子查询应该只返回一列,

....
WHERE ti.tagid NOT IN (SELECT tagid FROM tagitem WHERE itemid = '22')
于 2012-11-11T13:12:48.907 回答