用户排名表中有多少喜欢/ upvotes用户

时间:2014-08-10 19:45:37

标签: php mysql sql ranking

我正在尝试根据用户对所有项目总共有多少喜欢/投票来创建排名表。 upvotes表中的用户链接到用户的id,但我认为你不需要这个。

希望通过提供这些表格,一切都会变得清晰。

我认为这里的诀窍是获取每个项目的所有upvotes并将它们合并到该项目来自的用户,以获得每个用户的总喜欢,然后基于该总计对所有用户进行排名。当然,这样做可能是一个缓慢的查询,所以我需要一种非常高效的方法来处理这个问题。

这里的困难主要在于upvotes表不包含用户ID。

3张表:

CREATE TABLE `items` (
  `id` int(255) NOT NULL AUTO_INCREMENT,
  `user_id` int(255) NOT NULL,
  `img` varchar(500) NOT NULL,
  `message` varchar(200) NOT NULL,
  `created_on` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `active` int(11) NOT NULL DEFAULT '1',
  PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=19 DEFAULT CHARSET=latin1;

CREATE TABLE `upvotes` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `user` int(255) NOT NULL,
  `item_id` int(255) NOT NULL,
  `created_on` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=4 DEFAULT CHARSET=latin1;

CREATE TABLE `users` (
  `id` int(255) NOT NULL AUTO_INCREMENT,
  `email` varchar(255) NOT NULL,
  `password` binary(60) NOT NULL,
  `first_name` varchar(255) NOT NULL,
  `last_name` varchar(255) NOT NULL,
  `active` int(1) NOT NULL DEFAULT '1',
  `created_on` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`),
  UNIQUE KEY `email` (`email`)
) ENGINE=MyISAM AUTO_INCREMENT=17 DEFAULT CHARSET=latin1;

我需要一个高性能的查询,根据每个用户对所有项目的喜欢次数进行排名?

我设法写了这个:

SELECT @rank := @rank + 1 AS rank, m.*
FROM (SELECT 
users.first_name as first_name,
users.last_name as last_name,
count(upvotes.item_id) as total
FROM upvotes
INNER JOIN users
ON users.id = (SELECT items.user_id FROM items WHERE items.id = upvotes.item_id LIMIT 1)
GROUP BY users.id
ORDER BY total DESC
) m, (SELECT @rank := 0) r

但我认为当数据库增长时,这将会非常缓慢......

2 个答案:

答案 0 :(得分:1)

您可以执行简单的联接查询,以获取每个用户项目的总喜欢量,并按结果计数按降序排序

SELECT u.*,i.*,COUNT(DISTINCT up.user) `total_user_likes_item`
FROM users u 
JOIN items i ON(i.user_id = u.id)
JOIN upvotes up ON(up.item_id = i.id)
GROUP BY u.id,i.id
ORDER BY  u.id,i.id,total_user_likes_item DESC

根据评论进行修改对于用户总数,您可以通过以下查询从组中删除i.id

SELECT u.*,COUNT(DISTINCT up.user) `total_user_likes_item`
FROM users u 
JOIN items i ON(i.user_id = u.id)
JOIN upvotes up ON(up.item_id = i.id)
GROUP BY u.id
ORDER BY  total_user_likes_item DESC

答案 1 :(得分:0)

我会尝试回答你的问题:

在表格users中,您可以添加行sum_upvotes。每当有人得到一个(投票)时,您将通过以下方式增加此列:

UPDATE users
SET sum_upvotes = sum_upvotes + 1
; 

当然,您将在表格upvotes中插入一列。 最后,您查询选择用户并通过upvotes对它们进行排序将如下所示

SELECT first_name, last_name
FROM users 
ORDER BY sum_upvotes
;

希望这会有所帮助。