我正在尝试根据用户对其所有项目的点赞/点赞总数来创建一个排名表。 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/