Mysql 按公共日期分组行

Mysql 按公共日期分组行,mysql,datetime,group-by,Mysql,Datetime,Group By,我必须填写下表: CREATE TABLE IF NOT EXISTS `ebets_odds` ( `id` int(11) NOT NULL AUTO_INCREMENT, `datetime` datetime NOT NULL, `match_id` int(11) NOT NULL, `opponent_id` int(11) NOT NULL, `value` float NOT NULL, PRIMARY KEY (`id`), KEY `match_i

我必须填写下表:

CREATE TABLE IF NOT EXISTS `ebets_odds` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `datetime` datetime NOT NULL,
  `match_id` int(11) NOT NULL,
  `opponent_id` int(11) NOT NULL,
  `value` float NOT NULL,
  PRIMARY KEY (`id`),
  KEY `match_id` (`match_id`),
  KEY `opponent_id` (`opponent_id`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=5 ;

INSERT INTO `ebets_odds` (`id`, `datetime`, `match_id`, `opponent_id`, `value`) VALUES
(1, '2013-09-04 23:09:39', 1, 1, 1.2),
(2, '2013-09-04 23:09:39', 1, 2, 1.8),
(3, '2013-09-05 11:54:10', 1, 1, 1.1),
(4, '2013-09-05 11:54:10', 1, 2, 1.9);
我希望得到以下SQL结果:

2013-09-04 23:09:39 | 1.2 | 1.8
2013-09-05 11:54:10 | 1.1 | 1.9
所以我想按日期时间按条目分组。 我试过了,但没用

SELECT ODDS_1.datetime, ODDS_1.value AS odds_1, ODDS_2.value AS odds_2 
FROM ebets_odds ODDS_1, ebets_odds ODDS_2 
WHERE ODDS_1.match_id = 1 AND ODDS_2.match_id = 1 
GROUP BY ODDS_1.datetime

对于某些用例,这可以使用函数来解决:它以逗号分隔列表的形式返回列中的值。如果逗号不适用于您,您可以选择其他分隔符。然后必须在应用程序中处理该列表

SELECT ODDS_1.datetime, GROUP_CONCAT(ODDS_1.value)
FROM ebets_odds ODDS_1
WHERE ODDS_1.match_id = 1
GROUP BY ODDS_1.datetime
输出:

2013-09-04 23:09:39 | 1.2,1.8
2013-09-05 11:54:10 | 1.1,1.9

这是一个数据透视查询。你似乎想在不同的专栏中了解这两个对手的情况。您可以使用条件聚合执行此操作:

SELECT o.datetime,
      max(case when opponent_id = 1 then o.value end) AS odds_1,
      max(case when opponent_id = 2 then o.value end) AS odds_2 
FROM ebets_odds o
WHERE match_id = 1
GROUP BY o.datetime;

你确定它坏了吗?如果有两个以上的条目具有相同的日期时间,该怎么办?还是只有一个?您是否正在尝试创建类似透视表的内容?如果一个日期有两个记录,另一个记录有三个呢?考虑在应用程序级别处理数据显示的问题(例如,用PHP中的简单循环,比如说)。此外,在没有任何聚合功能的情况下使用GROUP BY是不合适的。给定日期不能有三条记录,这些值是通过表单添加的,只有两个字段(赔率1和赔率2),我用它们注册了注册日期……然后必须在应用程序中处理,这恰恰否定了这一点。这似乎很有效,只是数值很奇怪。查看输出:数组([0]=>赔率对象([datetime]=>2013-09-04 23:09:39[赔率1]=>1.2000000476837158[赔率2]=>1.799999523162842)[1]=>赔率对象([datetime]=>2013-09-05 11:54:10[赔率1]=>1.100000023841858[赔率2]=>1.899997976158142))@VaN。额外的小数点是使用
float
而不是固定长度的十进制表示的产物,如
decimal(10,4)