我有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
添加为favoritos
和likes
chistes
。我感兴趣的是了解同一查询中每个usuario
的favoritos
和likes
的总数,并按一个或另一个数量(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;
id_usuario | nombre_usuario | total_likestotal_favoritos | total-interaction |
---|---|---|---|
2 | manolo-garcia | <1><2>3//tr>||
1 | jose perez | ||
安东尼奥·桑切斯 | |||
4 | 马纳利标签 | 0 | 0 |