私はここで少し状況を抱えています。
環境
ここにシリーズのデータベースがあります。シリーズ自体に 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 です。