MySQL:关联5个表LEFT JOIN和COUNT



我有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添加为favoritoslikeschistes。我感兴趣的是了解同一查询中每个usuariofavoritoslikes的总数,并按一个或另一个数量(favoritos的数量或likes的数量,取决于选择的内容)对usuarios的列表进行排序。我知道如何分别进行,也就是说,在两个不同的查询中:

  • 要列出usuarios以及我使用的favoritos总数:
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

我一直试图在一个数据库查询中完成这项工作,但我做不到。如果有人能帮忙,我真的很感激,向所有人致以问候!

更新了新需求的答案

但我有一个问题,当一个常用程序没有任何赞或收藏夹时,它不能很好地计算total_interaction的总和,因为total_likes或total_favoritos的值为null。我该怎么做?

只需使用COALESCE()操作求解if null return 0,它将返回列表中的第一个非空值

我们将表达式likes_stats.total_likes包装到中

COALESCE(likes_stats.total_likes, 0)

意味着如果likes_stats.total_likes为空,则返回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;
total_likes<1><2>3//tr>
id_usuarionombre_usuariototal_favoritostotal-interaction
2manolo-garcia
1jose perez
安东尼奥·桑切斯
4马纳利标签00

最新更新