というテーブルがありますnotifications
:
CREATE TABLE `notifications` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`user_id` int(11) DEFAULT NULL,
`type` varchar(20) NOT NULL DEFAULT '',
`parent_id` int(11) DEFAULT NULL,
`parent_type` varchar(15) DEFAULT NULL,
`type_id` int(11) DEFAULT NULL,
`etc` NULL
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=25 DEFAULT CHARSET=utf8;
それぞれnotification
が異なるテーブルに関連しています。parent_type
フィールドの値は、テーブルに使用するテーブルの名前を指定し* join
ます。すべてのターゲット テーブルには、類似した列がいくつかあります。
CREATE TABLE `tablename` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`is_visible` tinyint(1) NOT NULL,
`etc` NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;
現在、このクエリを使用して、ターゲット テーブルに関連する行が存在し、そのis_visible
フィールドが1
次のような通知を選択しています。
SELECT n.id,
FROM notifications n
LEFT JOIN books b ON n.parent_id = b.id AND n.parent_type = 'book' AND b.is_visible = 1
LEFT JOIN interviews i ON n.parent_id = i.id AND n.parent_type = 'interview' AND i.is_visible = 1
LEFT JOIN other tables...
WHERE n.user_id = 1
GROUP BY n.id
しかし、それはLEFT JOIN
テーブルと一致するかどうかにかかわらず通知を返すので、ターゲットテーブルのどの行とも一致しない通知を返さないように書き直すにはどうすればよいですか? 私もCASE
ステートメントを試してみましたが失敗しました。