回答

收藏

根据列值连接不同的表

技术问答 技术问答 137 人阅读 | 0 人回复 | 2023-09-13

我有一个表叫notifications:. c* g& B. x* Z, F+ R1 p. s
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_typefield指定了我想用的值*join表的名称。所有目标表都有几个类似的列:
! E9 k1 E5 b4 ZCREATE 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:
6 L/ s6 q* e& k6 A+ ~9 U7 PSELECT n.id,FROM notifications n LEFT JOIN books b ON n.parent_id = b.id AND n.parent_type = 'book' AND b.is_visible = 1LEFT JOIN interviews i ON n.parent_id = i.id AND n.parent_type = 'interview' AND i.is_visible = 1LEFT JOIN other tables...WHERE n.user_id = 1GROUP BY n.id但因为是a LEFTJOIN,如果它与任何表不匹配,它将返回通知。我应该如何重写它,这样它就不会返回与目标表中任何行不匹配的通知?我也试过了CASE声明不成功。7 O7 S2 Z: O% s
                                                                1 U6 Z/ v! X3 f  \3 i
    解决方案:
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则