1

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

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

我已经尝试了“!=”,“<>”和以上的组合,几乎在我能想到的每一个排列中,但没有一个排除“何塞”,他们应该这样做,因为标签存在于“标签”中" 表和包含参考的 "bookmarks-tags" 表。

有任何想法吗?

4

1 回答 1

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)

我更喜欢第一个选项。

于 2013-05-04T10:35:30.240 回答