php - 用户点赞数/点赞数排名表

标签 php mysql sql ranking

我正在尝试根据用户对其所有项目的点赞/点赞总数来创建一个排名表。 upvotes 表中的用户链接到进行点赞的用户的 id,但我认为您不需要这个。

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

我认为这里的技巧是获取每个项目的所有赞成票,并将它们合并到该项目所属的用户,以获得每个用户的总喜欢,然后根据这个总数对所有用户进行排名。当然,这样做可能会是一个缓慢的查询,所以我需要一种非常高效的方法来处理这个问题。

这里的难点主要是赞成表不包含用户 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

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

最佳答案

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

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

关于php - 用户点赞数/点赞数排名表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25232364/

相关文章:

php - 返回给定整数的下一个最接近的 2 次幂

php - 瓢虫调试器的一些功能在 symfony2 php 应用程序中不起作用

mysql - 从不同的内部连接表中选择值

c# - 将数据库中的所有列自动添加到 INSERT INTO 查询

sql - 查找磁盘上缺少文件的 PostgreSQL 记录,以及磁盘上缺少数据库记录的文件

php - 如何防止使用动态表名进行 SQL 注入(inject)?

php - 无法从 php 将 ids 添加到 mysql 中的字段

php - Q : Edit New Password PHP Mysql

mysql - 如何在python中将数组插入数据库?

c# - 页面过期时 Asp.net c# 301 重定向