为了简化我的情况,我有两个表:mysql中的blogs(id, title, content, ...)blogtags(blogid, tagid)blogtagsblogs有多对一关系,其中blogtags.blogidblogs.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/

10-11 19:17