-1

我有一个包含多种内容类型和用户的数据库,以及一个带有点赞的单独数据库。我试图弄清楚哪些用户的任何内容获得了最多的喜欢,无论是什么类型。

我已经能够找出通过特定内容类型查找最喜欢的用户的查询,但事实证明,使用任何内容类型都比较困难。

值得注意的是,该数据库中有数百万条记录。

这是我在创建查询方面一直在做的工作......我很确定它不正确!

SELECT picture.user_id, video.creator_id, post.author_id
FROM likes_service.likes
INNER JOIN prod.pictures picture ON likes.obj_id = picture.id
INNER JOIN prod.videos video ON likes.obj_id = video.id
INNER JOIN prod.posts post ON likes.obj_id = post.id
GROUP BY picture.user_id, video.creator_id, post.author_id
ORDER BY COUNT(picture.user_id), COUNT(video.creator_id), COUNT(post.author_id) DESC
LIMIT 20;

有人可以给我一个提示或指出我正确的方向吗?我觉得我越来越近了...

谢谢!

4

2 回答 2

2

我认为您想要一个 UNION,而不是多路 JOIN。

select objects.user_id user_id, sum(likes.like_count) like_count
from (
    select user_id, id
    from prod.pictures
    union all
    select creator_id, id
    from prod.videos
    union all
    select author_id, id
    from prod.posts) objects
join (select obj_id, count(*) likes_count
      from likes_service.likes
      group by obj_id) likes on likes.obj_id = objects.id
group by user_id
order by like_count desc
于 2012-12-14T00:22:09.800 回答
1

目前尚不清楚您是否想要拥有列出最多喜欢的对象的用户,或者您是否正在寻找在其所有内容中拥有最多总体喜欢的用户。

考虑一个只有一张照片有 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 出现在和表中。(否则,您可能会在旁边的某处有一列告诉您正在引用哪个表。)likesidobj_idphotosvideosobj_idobj_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
于 2012-12-14T00:46:49.340 回答