mysqlのクエリにおいて、「①の結果がなければ、②の条件で探す」というような表現は可能でしょうか。
条件
⓪ある1つのカラム(親テーブルの外部キー)の値ごとにデータを取得したい
+
①現在日付より前の日付があれば最も新しい日付のレコードを抽出する
②①に該当するものがなかった場合、現在日付よりも後の日付で最も古い日付のレコードを抽出する
上記のような条件で各外部キーのカラムごとに1レコードだけ抽出するようなクエリが書きたいのですが、
現状以下に書いたクエリで、各外部キーごとに①もしくは②に合致するレコードを返すものを書いたのですが、この場合外部キーのカラムごとに最大2レコード返ってしまいます。この結果をプログラム側でやりくりすれば取りたいデータは取れなくはなさそうなのですが、
INとサブクエリを利用しているのでパフォーマンスが悪そうなので、もっと上手い方法をご存知の方がいれば教えていただきたく、質問させていただきました。
ご回答よろしくお願いいたします。
CREATE TABLE `parent` (
`parent_id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT '親テーブルID'
) COMMENT='親テーブル';
CREATE TABLE `child` (
`child_id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT 'id',
`switching_date` date NOT NULL COMMENT '切替日',
`parent_id` int(10) unsigned NOT NULL COMMENT '親テーブルID'
) COMMENT='子テーブル';
SELECT * FROM child
WHERE
(
(child.parent_id,child.switching_date)
IN (
SELECT parent_id,MAX(switching_date) AS switching_date FROM child AS latest_child
WHERE latest_child.switching_date <= DATE_FORMAT(NOW(), '%Y%m%d')
GROUP BY latest_child.parent_id
ORDER BY switching_date DESC
)
OR
(child.parent_id,child.switching_date)
IN (
SELECT parent_id,MIN(switching_date) AS switching_date FROM child AS future_child
WHERE future_child.switching_date > DATE_FORMAT(NOW(), '%Y%m%d')
GROUP BY future_child.parent_id
ORDER BY switching_date DESC
)
)
GROUP BY child.parent_id,child.switching_date
ORDER BY child.switching_date ASC ;