2013-09-05 3 views
0

я должен следующей таблице:Группировка строк по общей дате

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 

Так что я хотел бы группировать записями по DateTime , Я пробовал это, но он не работает.

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 
+0

Вы уверены, что это не работает? http://sqlfiddle.com/#!2/50cfb/1 – jcho360

+0

Что должно произойти, если имеется более двух записей с одним и тем же днем? Или только один? – Joni

+0

Вы пытаетесь создать что-то вроде сводной таблицы? Что делать, если есть две записи для одной даты и три - для другой? –

ответ

0

Для некоторых случаев использования этого могут быть решены с помощью функции group_concat: он возвращает значения из столбца в виде списка разделенных запятыми. Если запятые не работают для вас, вы можете выбрать другой разделитель. Затем список должен быть обработан в приложении.

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 
+1

... должен быть обработан в приложении, что скорее отрицает точку. – Strawberry

1

Это поворотное запрос. Кажется, вам нужна информация о двух противниках в разных колонках. Вы можете сделать это с условной агрегацией:

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; 
+0

Это, похоже, работает очень хорошо, за исключением того, что значения действительно странные. искать выход: Array ( [0] => Коэффициенты объекта ( [DateTime] => 2013-09-04 23:09:39 [odds_1] => 1,2000000476837158 [odds_2] => 1,7999999523162842 ) [1] => Коэффициенты объекта ( [DateTime] => 2013-09-05 11:54:10 [odds_1] => 1.100000023841858 [odds_2] => 1,899999976158142 ) ) – VaN

+0

@VaN. , , Дополнительные десятичные точки являются артефактом использования 'float' вместо десятичного представления фиксированной длины, например' decimal (10, 4) '. –

Смежные вопросы