【问题标题】:MySQL: Relate 5 tables LEFT JOIN and COUNTMySQL:关联 5 个表 LEFT JOIN 和 COUNT
【发布时间】:2021-11-06 02:53:53
【问题描述】:

我有 5 张桌子:

  • usuarios:

    | id_usuario | nombre_usuario  |
    | ---------- | --------------- |
    | 1          | jose perez      |
    | 2          | manolo garcia   |
    | 3          | antonio sanchez |
    
  • productos

    | id_producto | nombre_producto   |
    | ----------- | ----------------- |
    | 1           | camiseta espinete |
    | 2           | camiseta batman   |
    | 3           | camiseta simpson  |
    
  • favoritos

    | id_favoritos | id_producto | id_usuario |
    | ------------ | ----------- | ---------- |
    | 1            | 3           | 2          |
    | 2            | 1           | 3          |
    | 3            | 2           | 1          |
    
  • chistes:

    | id_chiste | titulo_chiste    |
    | --------- | ---------------- |
    | 1         | chiste arevalo   |
    | 2         | chiste jose mota |
    | 3         | chiste gatos     |
    
  • likes:

    | id_like | id_chiste | id_usuario |
    | ------- | --------- | ----  ---- |
    | 1       | 3         | 2          |
    | 2       | 1         | 3          |
    | 3       | 2         | 1          |
    

usuario 可以将productos 添加为favoritoslikes chistes。我有兴趣了解同一查询中每个usuariofavoritoslikes 的总数,并将usuarios 的列表按一个或另一个数量排序(favoritos 的数量或likes 的数量,取决于选择的内容)。我知道如何分开做,也就是在两个不同的查询中:

  • 列出usuariosfavoritos 的总数我使用:
SELECT usuarios.*,
count(favoritos.id_usuario) AS numFavoritos
FROM usuarios
LEFT JOIN favoritos 
ON usuarios.id_usuario = favoritos.id_usuario
GROUP BY usuarios.id_usuario
ORDER BY numFavoritos DESC
  • 并列出我使用的总点赞数的用户:
SELECT usuarios.*,
count(likes.id_usuario) AS numLikes
FROM usuarios
LEFT JOIN likes 
ON usuarios.id_usuario = likes.id_usuario
GROUP BY usuarios.id_usuario
ORDER BY numLikes DESC

我一直在尝试在单个数据库查询中执行此操作,但我做不到。 如果有人可以提供帮助,我将不胜感激,向大家问好!

【问题讨论】:

    标签: mysql sql database count left-join


    【解决方案1】:

    为新要求更新答案

    但是我有一个问题,当一个usuario没有任何喜欢或收藏时,它不能很好地完成total_interaction的总和,因为total_likes或total_favoritos的值为null。我该怎么做?

    只需使用COALESCE() 操作解决您的if null return 0,它将return the first non-null value in the list

    我们将表达式likes_stats.total_likes 包装成

    COALESCE(likes_stats.total_likes, 0)
    

    表示如果likes_stats.total_likes为NULL,则返回0

    完整查询

    SELECT u.id_usuario, u.nombre_usuario, 
    COALESCE(likes_stats.total_likes, 0) as total_likes, 
    COALESCE(favoritos_stats.total_favoritos, 0) as total_favoritos,
    COALESCE(likes_stats.total_likes, 0) + COALESCE(favoritos_stats.total_favoritos, 0) as total_interaction
    FROM usuarios u
    -- joining with the like count group by each user
    LEFT JOIN 
    (SELECT CASE WHEN COUNT(*) IS NOT NULL THEN COUNT(*) ELSE 0 END as total_likes, id_usuario FROM likes
    GROUP BY id_usuario) likes_stats ON u.id_usuario = likes_stats.id_usuario
    -- joining with the favourite count group by each user
    LEFT JOIN 
    (SELECT COUNT(*) as total_favoritos, id_usuario FROM favoritos
    GROUP BY id_usuario) favoritos_stats ON u.id_usuario = favoritos_stats.id_usuario
    ORDER BY likes_stats.total_likes DESC;
    
    id_usuario nombre_usuario total_likes total_favoritos total_interaction
    2 manolo garcia 1 2 3
    1 jose perez 1 1 2
    3 antonio sanchez 1 1 2
    4 manali tagret 0 0 0

    说明
    您需要将 user 表与每个用户的 like 和每个用户的 favourite 的两个额外的统计计数表连接起来。

    每个 usuario 表的点赞数(别名 likes_stats)为您提供每个 usuario 的点赞数

    SELECT COUNT(*) as total_likes, id_usuario FROM likes
    GROUP BY id_usuario
    
    total_likes id_usuario
    1 1
    1 2
    1 3

    Favorito per usuario table(别名 favoritos_stats)为您提供每个 usuario 的收藏数量

    SELECT COUNT(*) as total_favoritos, id_usuario FROM favoritos
    GROUP BY id_usuario
    
    total_favoritos id_usuario
    1 1
    2 2
    1 3

    然后我们通过id_usuario简单地连接三个表:usuariolikes_statsfavoritos_stats

    您可以按自己的喜好按喜欢的方式排序,或者通过likes_stats.total_likesfavoritos_stats.total_favoritos 收藏来排序

    我还添加了total_interaction,它是总喜欢和喜爱的总和,以防你想按总喜欢和喜爱一起排序,只是为了方便。

    这里是SQL fiddle for the test schema you provided

    【讨论】:

    • 非常感谢您的帮助!我已将INNER JOIN 更改为LEFT JOIN,因为我有兴趣显示所有usuarios。但是我对此有一个问题,当usuario 没有任何likesfavoritos 时,它不会很好地计算total_interaction 的总和,因为total_likestotal_favoritos 的值是@ 987654352@。我该怎么做?谢谢!
    • 嗨@SousetPunset,请查看我的更新查询以及解释和文档,我们将通过COALESCE 操作解决if null return 0 的问题。
    • 嗨@SousetPunset,如果您需要进一步的帮助,请告诉我。如果您觉得我的回答有帮助,请接受并点赞,这样您的问题就不再被标记为“未回答”。谢谢
    猜你喜欢
    • 2016-12-16
    • 2020-05-17
    • 1970-01-01
    • 1970-01-01
    • 2013-04-19
    • 2019-07-21
    • 1970-01-01
    • 2012-05-26
    • 2021-11-03
    相关资源
    最近更新 更多