0

在这种情况下,我有三个主表:leage_ladders、league_squads 和league_experience。我目前正在处理天梯视图页面,并希望在给定天梯上找到所有有经验的小队。该查询没有返回任何错误,但是,它只返回一行,我不知道为什么。

以下是我正在使用的查询:

$query_squads = "
            SELECT
                s.squad_id AS squad_id, s.ladder_id, s.team_id AS team_id,
                x.experience_id, x.squad_id, SUM(x.value) as total_exp
            FROM league_squads AS s
            LEFT JOIN league_experience AS x ON (s.squad_id = x.squad_id)
            WHERE s.ladder_id = ".$ladder_id."
            HAVING total_exp > 0
            ORDER BY total_exp DESC
            ";

以下是我的表格:

--
-- Table structure for table `league_experience`
--

CREATE TABLE IF NOT EXISTS `league_experience` (
  `experience_id` int(15) NOT NULL,
  `squad_id` int(15) NOT NULL,
  `value` int(15) NOT NULL,
  `date_earned` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  `description` varchar(255) NOT NULL,
  PRIMARY KEY (`experience_id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

--
-- Dumping data for table `league_experience`
--

INSERT INTO `league_experience` (`experience_id`, `squad_id`, `value`, `date_earned`, `description`) VALUES
(1, 1, 500, '2013-09-03 07:10:59', 'For being ballers.'),
(2, 2, 250, '2013-09-03 07:10:52', 'For being awesome.');

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

--
-- Table structure for table `league_squads`
--

CREATE TABLE IF NOT EXISTS `league_squads` (
  `squad_id` int(15) NOT NULL AUTO_INCREMENT,
  `team_id` int(15) NOT NULL,
  `ladder_id` int(15) NOT NULL,
  `date_joined` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  `status` tinyint(1) NOT NULL,
  `last_rank` tinyint(5) NOT NULL,
  PRIMARY KEY (`squad_id`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=3 ;

--
-- Dumping data for table `league_squads`
--

INSERT INTO `league_squads` (`squad_id`, `team_id`, `ladder_id`, `date_joined`, `status`, `last_rank`) VALUES
(1, 1, 1, '2013-09-02 09:43:53', 0, 0),
(2, 2, 1, '2013-09-03 06:14:49', 0, 0);

当访问 ladder_id 1 时,查询应该返回两个结果。但它只显示第一个结果。

4

4 回答 4

0

您的选择部分具有聚合功能:SUM(x.value) as total_exp. 并且因为没有GROUP BY,所以您将得到一行 total_exp 匹配行的总和。

于 2013-09-03T08:11:40.907 回答
0

因为您使用的是SUM()没有GROUP BY子句的聚合函数。它的作用是计算所有过滤记录的总和,并为非聚合列返回一个随机值。尝试添加GROUP BY子句,

WHERE ...
GROUP BY s.squad_id, s.ladder_id, s.team_idd, x.experience_id, x.squad_id
ORDER BY ...

根据 MySQL Docs,

如果在不包含 GROUP BY 子句的语句中使用分组函数,则相当于对所有行进行分组。有关更多信息,请参阅第 12.15.3 节,MySQL 对 GROUP BY 的扩展

于 2013-09-03T08:11:43.910 回答
0

这是因为您使用聚合函数:

SUM(x.value) as total_exp

它会自动对行进行分组。而且因为您没有定义GROUP BY子句,它将所有行组合在一起。

于 2013-09-03T08:12:09.823 回答
0

是的,您使用了 SUM() 聚合函数。

我修复了你的 SQL。

SELECT
s.squad_id AS squad_id, s.ladder_id, s.team_id AS team_id,
x.experience_id, x.squad_id, SUM(x.value) as total_exp
FROM league_squads AS s
LEFT JOIN league_experience AS x ON (s.squad_id = x.squad_id)
WHERE s.ladder_id = "1"
GROUP BY s.squad_id, s.ladder_id, s.team_id, x.experience_id
ORDER BY s.squad_id DESC

我只插入 1 行。澄清。它确定 SUM() 的内容。当然,您可以更改此条件。

GROUP BY s.squad_id, s.ladder_id, s.team_id, x.experience_id

谢谢。

于 2013-09-03T08:19:35.790 回答