【问题标题】:SQL join, sum, group-by and instead of null 0SQL join, sum, group-by and 而不是 null 0
【发布时间】:2024-01-15 15:10:01
【问题描述】:

我需要一个包含帖子 ID、帖子标题、帖子创建_at、用户名和喜欢状态的查询。如果不存在,likes-status 应该为 0。我需要喜欢状态的总和。像这样:

id |title   |created_at |name  |status  |
=========================================
1  |Hello 1 |2015-07-22 |Baker |0       |    // 1 - 1
2  |Hallo 2 |2015-07-23 |Tom   |0       |    // if not exists = 0

我的尝试:

SELECT p.id, p.title, p.created_at, u.name, IFNULL(l.status, 0) as status
FROM posts p
LEFT OUTER JOIN likes l ON l.post_id = p.id
INNER JOIN users u ON u.id = p.user_id

结果:

id |title   |created_at |name  |status  |
=========================================
1  |Hello 1 |2015-07-22 |Baker |1       |    // sum this
1  |Hello 1 |2015-07-22 |Baker |-1      |    // with this
2  |Hallo 2 |2015-07-23 |Tom   |0       |

用户表

id |name  |email             |password |created_at |
====================================================
1  |Baker |baker@example.com |UHds(&   |2015-07-20 |
2  |Tom   |tom@example.com   |ihj=)?   |2015-07-21 |

帖子表

id |user_id |title   |created_at |
==================================
1  |1       |Hello 1 |2015-07-22 |
2  |2       |Hello 2 |2015-07-23 |

点赞表

id |user_id |post_id |status |created_at  |
===========================================
1  |1       |1       |1      |2015-07-24  |
2  |2       |1       |-1     |2015-07-25  |

【问题讨论】:

    标签: mysql join group-by sum


    【解决方案1】:

    如果您使用left join 开始查询,那么您应该继续它。这实际上不会影响您的查询,它需要group by,但这仍然是一个好主意:

    SELECT p.id, p.title, p.created_at, u.name, COALESCE(sum(l.status), 0) as status
    FROM posts p LEFT OUTER JOIN
         likes l
         ON l.post_id = p.id LEFT OUTER JOIN 
         users u
         ON u.id = p.user_id
    GROUP BY p.id, p.title, p.created_at, u.name;
    

    【讨论】:

    • 谢谢!我有一个错误。状态列是一个类型为 1 和 -1 的枚举。对于 1 - 1,我总是得到 3 而不是 0。