<>的问题通过MySQL中的INNER JOIN查询

时间:2013-05-04 10:31:28

标签: mysql

我正在尝试按名称查找标记,但前提是关系表中不存在对它的引用:

SELECT
    tags.tag_id, tags.tag
FROM
    tags
INNER JOIN
    bookmarks_tags
ON
    (bookmarks_tags.user_id = tags.user_id)
WHERE
    (tags.user_id = '1')
AND
    (tags.tag LIKE '%Jose%')
AND
    (bookmarks_tags.tag_id NOT IN (tags.tag_id))
GROUP BY tags.tag_id

我尝试了“!=”,“<>”和上面的组合,几乎可以想到的每一个排列,但没有一个排除“Jose”,他们应该这样做,因为标签是存在于“tags”表中,以及“bookmarks-tags”表,其中包含引用。

有什么想法吗?

1 个答案:

答案 0 :(得分:5)

执行LEFT JOIN并排除匹配的行:

SELECT tags.tag_id, tags.tag
FROM tags
    LEFT JOIN bookmarks_tags 
        ON bookmarks_tags.user_id = tags.user_id
            AND bookmarks_tags.tag_id = tags.tag_id
WHERE tags.user_id = 1 
    AND tags.tag LIKE '%Jose%'
    AND bookmarks_tags.tag_id IS NULL

或者你可以使用子查询:

SELECT tag_id, tag
FROM tags
WHERE user_id = 1 
    AND tag LIKE '%Jose%'
    AND tag_id IS NULL
    AND tag_id NOT IN (SELECT tag_id FROM bookmarks_tags WHERE user_id = 1)

我更喜欢第一种选择。