mysql - 一对多,在一个查询中选择一个和多个

标签 mysql sql join left-join

我有四张 table

发布——用户——图片——评论

我想检索有关所有帖子的信息、发布帖子的用户、与之关联的图像(每个帖子只有一张图片)以及与每个给定帖子关联的(列表/数组)评论。

这是我的:

SELECT * 
FROM post 
LEFT JOIN image 
    ON post.image_id=image.id 
LEFT JOIN user 
    ON user.id=post.user_id 
LEFT JOIN comment 
    ON comment.post_id =post.id

这几乎可以工作,除了每个帖子记录都针对它的许多评论中的每一个重复。我如何获得一条包含所有评论的记录?

最佳答案

除了 * 操作符真的很低效,你不能只在一个查询中做“一个帖子”<=>“很多评论”。每个条目都将合并帖子及其评论。

您可以使用技巧,例如 GROUP_CONCAT 来创建“注释行”。但这真的很奇怪。

Group_Concat 的示例

SELECT p.*, 
   GROUP_CONCAT(image.url SEPARATOR "~") AS image_url, GROUP_CONCAT(comment.text SEPARATOR "#~#") AS comment_text
   FROM post p 
LEFT JOIN image 
    ON p.image_id=image.id 
LEFT JOIN user 
    ON user.id=p.user_id 
LEFT JOIN comment 
   ON comment.post_id =p.id

它会给你每篇文章一行,每条评论用“#~#”粘在一起。不太酷。

我认为您只需要让 SQL 自然地处理它即可。

关于mysql - 一对多,在一个查询中选择一个和多个,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24870967/

相关文章:

mysql - 有没有办法在 mysql now() 函数中显示上午/下午?

sql - 依靠 GROUP BY 以及结果总数

join - magento 在 grid.php 中使用 join 准备集合

php - MYSQL 转PHP 无法获取汉字

php - Symfony2 如何在多对多连接表中继承外键

java - 有关服务器、数据库和 android 的问题

sql - 从 Row 对象中提取值

java - 如何使用注释处理 Hibernate 和 Spring 中的连接查询?

php - 性能问题 - 在额外的表或 php 数组中保存国家名称和其他属性?

mysql - 为什么我的查询显示平均值的多个结果?