私はそのようなデータベースを持っています:
CREATE TABLE IF NOT EXISTS `opponents` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(255) NOT NULL
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=9 ;
INSERT INTO `opponents` (`id`, `name`) VALUES
(1, 'Team 1'),
(2, 'Team 2'),
(3, 'Team 3'),
(4, 'Team 4'),
(5, 'Team 5'),
(6, 'Team 6'),
(7, 'Team 7'),
(8, 'Team 8');
CREATE TABLE IF NOT EXISTS `matches` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`game_id` int(11) NOT NULL,
`winner_id` int(11) NOT NULL,
`score` varchar(3) NOT NULL,
`statut` tinyint(4) NOT NULL,
PRIMARY KEY (`id`),
KEY `game_id` (`game_id`),
KEY `winner_id` (`winner_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=29 ;
INSERT INTO `matches` (`id`, `game_id`, `winner_id`, `score`, `statut`) VALUES
(1, 2, 8, '2-3', 3),
(2, 2, 0, '', 1),
(3, 2, 0, '', 1);
CREATE TABLE IF NOT EXISTS `odds` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`datetime` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
`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=utf8 AUTO_INCREMENT=63 ;
INSERT INTO `odds` (`id`, `datetime`, `match_id`, `opponent_id`, `value`) VALUES
(1, '2013-11-05 16:33:26', 1, 1, 1),
(2, '2013-11-05 16:33:26', 1, 8, 1),
(3, '2013-11-05 16:50:19', 2, 2, 1),
(4, '2013-11-05 16:50:19', 2, 3, 1),
(5, '2013-11-05 16:51:11', 3, 5, 1),
(6, '2013-11-05 16:51:11', 3, 7, 1);
すべての対戦相手のリストを、勝利数と合計試合数とともに取得したいと考えています。対戦相手とその勝利のリストに問題はありません。次のようなクエリを書きました。
SELECT `o`.`id`, `o`.`name`, COUNT(m.id) AS victories FROM (`opponents` o) LEFT JOIN `matches` m ON `m`.`winner_id` = `o`.`id` GROUP BY `o`.`id` ORDER BY `victories` DESC
しかし、プレイした試合の合計を取得するのに問題があります。難しいのは、対戦相手が直接 MATCHES テーブルではなく、ODDS テーブルに保存されることです。このクエリを試しましたが、チーム #1 が 1 試合しかプレーしなかった (そして勝利した) 場合、合計 7 試合が行われたことが返されます。
SELECT `o`.`id`, `o`.`name`, COUNT(m.id) AS victories, COUNT(m2.id) AS played FROM (`estv_opponents` o) LEFT JOIN `estv_matches` m ON `m`.`winner_id` = `o`.`id` LEFT JOIN `estv_odds` ON `estv_odds`.`opponent_id` = `o`.`id` LEFT JOIN `estv_matches` m2 ON `m2`.`id` = `estv_odds`.`match_id` AND m2.statut = 3 GROUP BY `o`.`id`, `estv_odds`.`opponent_id` ORDER BY `victories` DESC
3 回目の参加では、"m2.statut = 3" は、試合が行われて終了したことを指定するためにここにあります。それが私が望むものです、すべての試合の数ではなく、プレイされた試合の数です(まだプレイされていないものもあります)
このクエリを作成する方法がわかりません。
私の予想される出力は、次のような配列です。
このような配列:
array(8) {
[0]=>
array(4) {
["id"]=>
string(1) "8"
["name"]=>
string(9) "Team #8"
["victories"]=>
string(1) "1"
["played"]=>
string(1) "1"
}
[1]=>
array(4) {
["id"]=>
string(1) "1"
["name"]=>
string(8) "Team #1"
["victories"]=>
string(1) "0"
["played"]=>
string(1) "1"
}
[2]=>
array(4) {
["id"]=>
string(1) "2"
["name"]=>
string(3) "Team #2"
["victories"]=>
string(1) "0"
["played"]=>
string(1) "0"
}
[3]=>
array(4) {
["id"]=>
string(1) "3"
["name"]=>
string(5) "Team #3"
["victories"]=>
string(1) "0"
["played"]=>
string(1) "1"
}
[4]=>
array(4) {
["id"]=>
string(1) "4"
["name"]=>
string(10) "Team #4"
["victories"]=>
string(1) "0"
["played"]=>
string(1) "1"
}
[5]=>
array(4) {
["id"]=>
string(1) "5"
["name"]=>
string(5) "Team #5"
["victories"]=>
string(1) "0"
["played"]=>
string(1) "0"
}
[6]=>
array(4) {
["id"]=>
string(1) "6"
["name"]=>
string(2) "Team #6"
["victories"]=>
string(1) "0"
["played"]=>
string(1) "0"
}
[7]=>
array(4) {
["id"]=>
string(1) "7"
["name"]=>
string(7) "Team #7"
["victories"]=>
string(1) "0"
["played"]=>
string(1) "0"
}
}