0

私はそのようなデータベースを持っています:

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"
  }
}
4

1 に答える 1