我有這 3 張表:
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));
我想從報表表中取得至少滿足以下條件之一的行:
1 - The field public_access is true 2 - The report is in the related table report_users with in parameter user_id 3 - The report is in the related table report_groups with in parameter group_id
首先,我建立一個可公開存取的新報告:
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) ;
我得到 2 行。它有效。
給我 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) ;
我得到 2 行。它有效。
但是。如果report_users或report_groups為空,我不會得到任何結果。我首先運行此查詢:
truncate table report_groups;
當我執行與以前相同的查詢時,我得到一個空集合。為什麼?實際上,看起來我發送的 user_id 和 group_id 沒有任何區別。我總是會得到 0 行。
對我來說,似乎只是因為兩個表之一是空的,所以我沒有得到任何結果。 查詢本身有問題嗎?
你用這行程式碼做什麼:
是 3 個表的(舊式)
CROSS JOIN
,這表示如果其中一個表為空,則結果也為空。而是使用
EXISTS
: