我有三张table:
create table reports(id int not null AUTO_INCREMENT,name varchar(255)not null,public_access tinyint not null,primary key (id));
create table report_users(id int not null AUTO_INCREMENT,report_id int not null,user_id int not null,primary key (id),foreign key (report_id) references reports(id));
create table report_groups(id int not null AUTO_INCREMENT,report_id int not null,group_id int not null,primary key (id),foreign key (report_id) references reports(id));
我想从reports-table中获取至少满足以下条件之一的行:
首先,我创建一个具有公共访问权限的新报表:
insert into reports values(null, 'report 1 open to all', 1);
然后是另一个只能由user_id = 1访问的报告:
insert into reports values(null, 'report 2 only for user_id 1', 0);
insert into report_users values(null, 2, 1);
然后是另一个只能由group_id = 1访问的报告
insert into reports values(null, 'report 3 only for group_id 1', 0);
insert into report_groups values(null, 3, 1);
现在,我有3行:一个可由所有人访问,一个仅由user_id = 1访问,一个仅用于group_id=1。
给予我user_id = 1的所有行:
select reports.*
from reports, report_users,report_groups
where
reports.public_access = 1
or
(report_users.report_id = reports.id and report_users.user_id = 1)
or
(report_groups.report_id = reports.id and report_groups.group_id = 5)
;
我有两排座位。很好用。
给予group_id = 1的所有行:
select reports.*
from reports, report_users,report_groups
where
reports.public_access = 1
or
(report_users.report_id = reports.id and report_users.user_id = 4)
or
(report_groups.report_id = reports.id and report_groups.group_id = 1)
;
我有两排座位。很好用。
但是。如果report_users或report_groups为空,则没有结果。我首先运行以下查询:
truncate table report_groups;
当我运行和以前一样的查询时,我得到一个空集。为什么?实际上,我发送的user_id和group_id看起来没有任何区别。我总是得到0行。
在我看来,仅仅因为两个表中有一个是空的,我就得不到任何结果。是查询本身出了什么问题吗?
1条答案
按热度按时间snz8szmq1#
你对这行做了什么:
是3个表中的
CROSS JOIN
(旧样式),这意味着如果其中一个表为空,则结果也为空。使用
EXISTS
: