在mysql中查询,如果其中一个表为空,则返回0结果

wxclj1h5  于 2023-04-19  发布在  Mysql
关注(0)|答案(1)|浏览(240)

我有三张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行。
在我看来,仅仅因为两个表中有一个是空的,我就得不到任何结果。是查询本身出了什么问题吗?

snz8szmq

snz8szmq1#

你对这行做了什么:

from reports, report_users,report_groups

是3个表中的CROSS JOIN(旧样式),这意味着如果其中一个表为空,则结果也为空。
使用EXISTS

select r.* 
from reports r
where r.public_access = 1
   or exists (select * from report_users u where u.report_id = r.id and u.user_id = ?)
   or exists (select * from report_groups g where g.report_id = r.id and g.group_id = ?);

相关问题