如何使用4个表中的信息创建团队排行榜?

时间:2013-08-29 17:21:56

标签: mysql sql

这很棘手,我的任务是创建一个团队领导委员会,让个人完成分数任务。分数在表“站”中定义,并且每次用户完成任务时 - 在帖子表中创建具有站的id和他们的RFID(射频ID)的帖子。有一个团队表,用于定义团队名称。

我需要一种方法来获得团队成员参与的所有职位分数(来自电台表的加入点)的总和。

结果应该按照团队得分进行排序,如果我们有4个团队,其中4个成员参与了4个事件,那么看起来就像是每个团队的总得分

Team name one (Teams.name) | score

Team name two (Teams.name) | score

Team name three (Teams.name) | score

表格 -

CREATE TABLE `posts` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `rfid` varchar(50) NOT NULL,
  `station_id` int(11) NOT NULL,
  `updated_at` datetime NOT NULL,
  `created_at` datetime NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=11 ;

-- --------------------------------------------------------

stations的表结构

CREATE TABLE `stations` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `description` text NOT NULL,
  `points` int(11) NOT NULL,
  `logic` varchar(200) NOT NULL,
  `created_at` datetime NOT NULL,
  `updated_at` datetime NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=1023 ;

-- --------------------------------------------------------

teams的表结构

CREATE TABLE `teams` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(255) NOT NULL,
  `created_at` datetime NOT NULL,
  `updated_at` datetime NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=7 ;

-- --------------------------------------------------------

users的表结构

CREATE TABLE `users` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `rfid` varchar(50) NOT NULL,
  `first_name` varchar(50) NOT NULL,
  `last_name` varchar(50) NOT NULL,
  `team` int(11) NOT NULL,
  `quiz_score` int(11) NOT NULL,
  `created_at` datetime NOT NULL,
  `updated_at` datetime NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=5 ;

我为单个排行榜创建了一个查询 -

SELECT users.first_name, users.last_name, posts.rfid, sum(stations.points) score 
FROM posts 
JOIN users ON posts.rfid = users.rfid  
JOIN stations ON posts.station_id = stations.id  
GROUP BY posts.rfid 
ORDER BY score DESC LIMIT 0 , 100

这是我迄今为止为团队所做的事情

SELECT name, (SELECT sum(stations.points) score FROM posts 
      JOIN users ON posts.rfid = users.rfid 
      JOIN stations ON posts.station_id = stations.id  
  WHERE users.team = teams.id 
      GROUP BY posts.rfid) team_score FROM teams

//subquery returns more than one row

我认为这可能是正确答案

SELECT name, 
    (SELECT sum(stations.points) score FROM posts
         JOIN users ON posts.rfid = users.rfid 
         JOIN stations ON posts.station_id = stations.id  
      WHERE users.team = teams.id ) team_score 
  FROM teams

0 个答案:

没有答案