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)
。