下記のようなテーブルから、下記の条件に該当するデータをINNER JOINを使って結合して取得したいです。
【前提】
現在日付を2022/12/07とする。
・テーブルA の post_status が publishのもの
・テーブルB の meta_keyに延長期限が設定されていれば、その値が現在日時以前のもの
・テーブルB の meta_keyに延長期限が設定されていないか、または空白の場合は、meta_key=有効期限の値が現在日時以前のもの
サンプルデータでいうと、post_idの1,2,3が取得される想定です。
上記に当てはまる条件式でSQLを書こうとしたのですが、JOINのON句の中で条件式を書こうとすると、meta_valueの指定でおかしくなっているようで取得できません。
何か良い方法はないでしょうか。
SELECT post.ID FROM wp_posts AS post INNER JOIN wp_postmeta AS pm ON post.ID = pm.post_id AND (pm.meta_key = '延長期限' AND pm.meta_value IS NOT NULL AND pm.meta_value >= 2022-12-07) OR (pm.meta_key = '延長期限' AND pm.meta_value IS NULL AND pm.meta_key = '有効期限' AND pm.meta_value >= 2022-12-07) WHERE (post.post_status = 'publish') ORDER BY pm.meta_value
【追記】
サンプルデータのcreate文を記載します。
SET NAMES utf8; SET time_zone = '+00:00'; SET foreign_key_checks = 0; SET sql_mode = 'NO_AUTO_VALUE_ON_ZERO'; DROP TABLE IF EXISTS `wp_postmeta`; CREATE TABLE `wp_postmeta` ( `meta_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT, `post_id` bigint(20) unsigned NOT NULL DEFAULT '0', `meta_key` varchar(255) DEFAULT NULL, `meta_value` longtext, PRIMARY KEY (`meta_id`), KEY `post_id` (`post_id`), KEY `meta_key` (`meta_key`(191)) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; INSERT INTO `wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES (1, 1, '有効期限', '2000-01-01'), (2, 1, '延長期限', '2023-01-01'), (3, 2, '有効期限', '2023-01-01'), (4, 3, '有効期限', '2023-01-01'), (5, 3, '延長期限', ''), (6, 4, '有効期限', '2000-01-01'); DROP TABLE IF EXISTS `wp_posts`; CREATE TABLE `wp_posts` ( `ID` bigint(20) unsigned NOT NULL AUTO_INCREMENT, `post_status` varchar(20) NOT NULL DEFAULT 'publish', PRIMARY KEY (`ID`), KEY `type_status_date` (`post_status`,`ID`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
回答3件
あなたの回答
tips
プレビュー