帮助棘手的MySQL查询

时间:2011-06-06 10:53:46

标签: php mysql

我很感谢你对此的帮助:

我有一个表,用于记录用户(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执行此操作?

感谢您的回答!

4 个答案:

答案 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)

对于用户#1234

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应用程序/网站上会很大。