我很感谢你对此的帮助:
我有一个表,用于记录用户(id_user)在某个事件(会议,音乐会......)(id_event)以及他对此事件的分数(长篇故事)。这是我的表:
CREATE TABLE `Leaderboards` (
`id` mediumint(9) NOT NULL AUTO_INCREMENT,
`id_event` mediumint(8) NOT NULL,
`user_id` mediumint(9) NOT NULL,
`score` smallint(4) NOT NULL DEFAULT '0',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
现在,我想向用户建议至少参与过一个共同事件的所有用户,并对已经参与过很多共同事件的用户进行排序。
我可能有想法在行请求后在php中执行此操作,但有没有更明智的方法直接通过MySQL执行此操作?
感谢您的回答!
答案 0 :(得分:3)
我想我可能会给你答案
SELECT leader1.user_id, leader2.user_id, COUNT(leader1.id) AS num
FROM Leaderboards AS leader1
INNER JOIN Leaderboards AS leader2 ON (
leader1.id_event = leader2.id_event AND
leader1.user_id != leader2.user_id
)
GROUP BY leader1.user_id, leader2.user_id
ORDER BY num DESC
这将选择至少一个共同事件的用户的ID,以及事件的数量。最后,它将按共同(num)降序的事件数量排序。如果您想为特定用户执行此操作,请添加where子句,如下面的
WHERE leader1.user_id = :user_id
我也相信这个查询非常有效。如果这不是您需要的,请告诉我,我会看看是否可以进行调整。
答案 1 :(得分:2)
SELECT user_id, COUNT(1)
FROM Leaderboards
WHERE user_id <> 1234
AND id_event IN (
SELECT id_event FROM Leaderboards WHERE user_id = 1234
)
GROUP BY user_id
ORDER BY COUNT(1) DESC
答案 2 :(得分:0)
我认为以下查询是合适的:
select count(event) as event_count, user_id from
(select distinct id_event as event, 1 as left_userid from `Leaderboards` where user_id = 1) as leftbl,
Leaderboards
where
event = Leaderboards.id_event AND
left_userid <> Leaderboards.user_id
group by
user_id
order by
event_count desc
首先,subselect确定给定用户的所有唯一事件(在本例中为1),然后将其与Leaderboards
表连接。用户计算事件和分组完成其余的工作。
答案 3 :(得分:0)
我会选择内部加入。据我所知,它可以减少服务器上的开销,特别是考虑到排行榜中的行数在流行的Web应用程序/网站上会很大。