我正在尝试根据用户对所有项目总共有多少喜欢/投票来创建排名表。 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
但我认为当数据库增长时,这将会非常缓慢......
答案 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
;
希望这会有所帮助。