条件
⓪ある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 ;