我正在尝试按名称查找标记,但前提是关系表中不存在对它的引用:
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”表,其中包含引用。
有什么想法吗?
答案 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)
我更喜欢第一种选择。