0

私はここで少し状況を抱えています。

環境

ここにシリーズのデータ​​ベースがあります。シリーズ自体に 1 つのテーブル、シリーズ テーブルに接続されたシーズン用に 1 つ、シーズン テーブルに接続されたエピソード用に 1 つ。さまざまな国の放送日があるため、次のような「series_data」という別のテーブルがあります。

CREATE TABLE IF NOT EXISTS `episode_data` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `episode_id` int(11) NOT NULL,
  `country` char(3) NOT NULL,
  `title` varchar(255) NOT NULL,
  `date` date NOT NULL,
  `tba` tinyint(1) NOT NULL,
  PRIMARY KEY (`id`),
  KEY `episode_id` (`episode_id`),
  KEY `date` (`date`),
  KEY `country` (`country`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8;

現在、次のクエリを使用して、データベース内の各シリーズから最後に放送されたエピソードを収集しようとしています。

SELECT
    *
FROM
    `episode_data` ed
WHERE
    `ed`.`date` < CURDATE( ) &&
    `ed`.`date` != '1970-01-01' &&
    `ed`.`series_id` = 1
GROUP BY
    `ed`.`country` DESC
ORDER BY
    `ed`.`date` DESC 

すべてを正規化したので、'episode_id' を 'series_id' に変更して、クエリの複雑さを軽減しました。

私が達成しようとしていること

1 つのクエリの返される結果として、実際に発表された国ごとの最終放送エピソード ( ed. date!= '1970-01-01') を取得したいと考えています。

どうしたの

私は今(Googleを検索しましたが、ここで答えが機能していないことがわかりました)、グループ化の後に順序付けが行われることを知っているので、私の「日付」の順序付けは完全に役に立ちません。

もう1つの問題は、上記のクエリが機能していることですが、テーブルインデックスの最初のものであるため、条件に一致するIDが最も低いエントリを常に取得します。

質問は何ですか?

上記を達成する方法。グループ化が正しい方法であるかどうかはわかりません。「ワンライナー」がない場合、唯一の方法は回避したいサブクエリだと思います。これは、正しいインデックスが設定されたワンライナーよりも遅いことがわかっているためです。

ここにあなたが必要とするすべてがあることを願っています:)

サンプルデータ

CREATE TABLE IF NOT EXISTS `episode_data` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `episode_id` int(11) NOT NULL,
  `country` char(3) NOT NULL,
  `title` varchar(255) NOT NULL,
  `date` date NOT NULL,
  `tba` tinyint(1) NOT NULL,
  PRIMARY KEY (`id`),
  KEY `episode_id` (`episode_id`),
  KEY `date` (`date`),
  KEY `country` (`country`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8;

INSERT INTO `episode_data` (`id`, `episode_id`, `country`, `title`, `date`, `tba`) VALUES
(4942, 2471, 'de', 'Väter und Töchter', '2013-08-06', 0),
(4944, 2472, 'de', 'Neue Perspektiven', '2013-08-13', 0),
(5013, 2507, 'us', 'Into the Deep', '2013-08-06', 0),
(5015, 2508, 'us', 'The Mirror Has Three Faces', '2013-08-13', 0);

注意! これは、「SERIES_ID」ではなく「EPISODE_ID」を持つ元のテーブル データです。

必要なデータは、今日に最も近い日付のデータで、ここでは 4944 と 5015 です。

4

1 に答える 1