目前尚不清楚您是否想要拥有列出最多喜欢的对象的用户,或者您是否正在寻找在其所有内容中拥有最多总体喜欢的用户。
考虑一个只有一张照片有 1000 个赞的用户,该用户是否应该排在拥有 100 张照片、视频和帖子的用户之前,平均点赞数为 20,点赞数最高为 50?
这是两个不同的查询。
现在,我将假设您要查找的是“最喜欢”的项目,然后查找这些对象中的每一个是由哪些用户创建/创作的。要找到 20 个“最喜欢”的项目,很容易找到哪些“ obj_id
”最喜欢......
SELECT l.obj_id
, COUNT(1) AS like_count
FROM likes_service.likes l
GROUP BY l.obj_id
ORDER BY like_count DESC
LIMIT 0,20
我假设(基于您的原始查询),并且没有模式和示例数据,表中的值引用obj_id
了其他表之一中单个对象的值......也就是说,一个值不会' t 出现在和表中。(否则,您可能会在旁边的某处有一列告诉您正在引用哪个表。)likes
id
obj_id
photos
videos
obj_id
obj_id
我们将之前的查询用作内联视图(MySQL 将其称为派生表),并给它一个方便的别名“ml”(最喜欢),我们将对每个目标对象表进行 LEFT JOIN(照片,视频,帖子),以找出它是什么类型的项目,以及用户/创建者/作者是谁。
SELECT ml.obj_id
, ml.like_count
, p.user_id
, v.creator_id
, t.author_id
FROM ( SELECT l.obj_id
, COUNT(1) AS like_count
FROM likes_service.likes l
GROUP BY l.obj_id
ORDER BY like_count DESC
LIMIT 0,20
) ml
LEFT
JOIN prod.pictures p
ON p.id = ml.obj_id
LEFT
JOIN prod.videos v
ON v.id = ml.obj_id
LEFT
JOIN prod.videos v
ON v.id = ml.obj_id
LEFT
JOIN prod.posts t
ON t.id = ml.obj_id
ORDER BY ml.like_count DESC
假设user_id
照片表中的列不为空,creator_id from the
视频表不为空...
然后,您可以确定 obj_id 是在哪个表中找到的。即如果该user_id
列不为空,您知道它来自照片表,如果creator_id
不为空,您知道它来自视频表。
您可以在最外面的选择中添加一些表达式来破译...
SELECT CASE WHEN p.user_id IS NOT NULL THEN 'photo'
WHEN v.creator_id IS NOT NULL THEN 'video'
WHEN t.author_ID IS NOT NULL THEN 'post'
END AS obj_type
, CASE WHEN p.user_id IS NOT NULL THEN p.user_id
WHEN v.creator_id IS NOT NULL THEN v.creator_id
WHEN t.author_id IS NOT NULL THEN t.author_id
END AS user_id
, l.obj_id