为了简化我的情况,我有两个表:mysql中的blogs(id, title, content, ...)
和blogtags(blogid, tagid)
。 blogtags
与blogs
有多对一关系,其中blogtags.blogid
是blogs.id
的外键。很基本。
我有一个查询,该查询为每个博客返回一行并将所有标签ID合并为一列:
SELECT blogs.*, GROUP_CONCAT(blogtags.tagid) as tagids FROM blogs
JOIN blogtags ON blogs.id=blogtags.blogid
GROUP BY blogs.id;
除某些博客没有标签(有些博客没有
blogtags
行)外,此方法工作正常。因此,这些博客被加入完全忽略了。INSERT INTO blogs(id, title, content) VALUES(1, 'Blog1', 'one'), (2, 'Blog2', 'two');
INSERT INTO blogtags(blogid, tagid) VALUES(1, 4), (1, 7);
(当然,我只是手动插入博客ID进行演示)
使用该数据集,select查询将仅获取包含第一个博客的行:
(id, title, content, tagids)
----------------------------
(1, 'Blog1', 'one', '4,7')
我想包含
blogs
的每一行,并且如果没有关联的标签,则只是让tagid为空字符串(或等效的东西)。(id, title, content, tagids)
----------------------------
(1, 'Blog1', 'one', '4,7')
(2, 'Blog2', 'two', '') # or tagids could be null or something
我将如何修改我的select语句以使其正常工作?这个操作又叫什么呢? imao,看来这可能是一个普通的情况。
这是一个带有更多实例的小提琴:http://sqlfiddle.com/#!9/633f4/5
最佳答案
尝试使用左联接,这样可以防止删除任何没有标签的博客。
SELECT
b.id,
COALESCE(GROUP_CONCAT(bt.tagid), 'no tags available') AS tagids
FROM blogs b
LEFT JOIN blogtags bt
ON b.id = bt.blogid
GROUP BY
b.id;
请注意,我使用
COALESCE
为那些没有标签的博客显示适当的消息。关于mysql - 在一对多关系中,如果表B未引用表A的某些行,那么如何获得表A的每一行?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/57518574/