MYSQL / PHP JOIN和排除条件

时间:2012-11-11 13:10:27

标签: mysql subquery

我有表标签和项目以及第三个表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

据我所知。 (现在我得到一些奇怪的操作数错误。)对于正确的方法做任何建议。谢谢!

1 个答案:

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

....
WHERE ti.tagid NOT IN (SELECT tagid FROM tagitem WHERE itemid = '22')