Mysql SQL:选择其关系列为空的行
假设我有两个名为Post和Tag的表,它们之间有多对多关系 如何选择没有附加标签的帖子 类似于Mysql SQL:选择其关系列为空的行,mysql,sql,Mysql,Sql,假设我有两个名为Post和Tag的表,它们之间有多对多关系 如何选择没有附加标签的帖子 类似于posts.where(post=>post.tags.length==0)尝试: SELECT post.* FROM post LEFT OUTER JOIN tag ON post.<link_field> = tag.<link_field> WHERE tag.<any_field> IS NULL; 选择post.* 从左后外侧连接标
posts.where(post=>post.tags.length==0)
尝试:
SELECT post.*
FROM post LEFT OUTER JOIN tag
ON post.<link_field> = tag.<link_field>
WHERE tag.<any_field> IS NULL;
选择post.*
从左后外侧连接标记
邮寄标签。
何处标记。为空;
当没有相关的(链接的)标记时,左外部联接将为标记字段生成所有POST和NULL结果。
因此,如果您使用以下选项进行筛选:
WHERE tag.<any_field> IS NULL
WHERE标记。是空的
你将得到没有标签的帖子
这是用PostgreSQL进行测试的,但应该适用于任何合理的数据库系统,因为它是纯SQL标准
希望这有帮助 使用左连接:
SELECT *
FROM posts
LEFT JOIN tags ON tags.post_id = posts.id
WHERE tags.id IS NULL;
使用不存在:
SELECT *
FROM posts
WHERE NOT EXISTS (
SELECT id FROM tags WHERE tags.post_id = posts.id
);
不在以下位置使用:
SELECT *
FROM posts
WHERE posts.id NOT IN (
SELECT DISTINCT post_id FROM tags
);
这两个表没有(或不应该)直接的多对多关系。为此,必须创建另一个表:
CREATE TABLE posts_tags(
post_id INT,
tag_id INT,
PRIMARY KEY (post_id, tag_id),
FOREIGN KEY(post_id) REFERENCES posts(id),
FOREIGN KEY(tag_id) REFERENCES tags(id)
)
保存所有相关的帖子和标签。使用此表,您可以跟踪所有未附加标签的帖子:
SELECT p.*
FROM posts p LEFT JOIN posts_tags pt
ON pt.post_id = p.id
WHERE pt.post_id IS NULL
或不存在具有的
:
SELECT p.*
FROM posts p
WHERE NOT EXISTS (SELECT 1 FROM posts_tags WHERE post_id = p.id)
有多种方法可以实现这一点。检查
不存在
左联接
内部查询
相关子查询
到目前为止您尝试了什么?您可以在筛选器中使用不在
中。外部联接未在中实现MySQL@SlavaRozhnevMySql不支持完全外部联接。支持左外部联接。(其中任何不可为null的字段均为null)