Mysql 正在尝试按查询打印以下输出
我有3个表,下面是客户机、属性和所有者的模式Mysql 正在尝试按查询打印以下输出,mysql,sql,join,Mysql,Sql,Join,我有3个表,下面是客户机、属性和所有者的模式 create table Property (property_no varchar(20), p_address varchar(50), rent_start date, rent_finish date, rent_per_day int, primary key(property_no,rent_start, rent_finish)); create table Client (client_no varchar(10), client
create table Property (property_no varchar(20), p_address varchar(50), rent_start date, rent_finish
date, rent_per_day int, primary key(property_no,rent_start, rent_finish));
create table Client (client_no varchar(10), client_name char(10), property_no varchar(10), foreign
key(property_no) references Property(property_no),primary key(client_no,client_name,property_no));
create table Owner (owner_no varchar(10), owner_name char(10), property_no varchar(10), foreign
key(property_no) references Property(property_no), primary key(owner_no,property_no));
insert into Property values('pg4', '6 Lawrence St.', '2000-01-07','2001-8-31', 50);
insert into Property values('pg16', '5 Novar Dr.', '2001-09-01','2002-9-1', 70);
insert into Property values('pg4', '6 Lawrence St.', '1999-09-02','2000-6-10', 50);
insert into Property values('pg36', '2 Manor Rd', '2000-10-10','2001-12-1', 60);
insert into Property values('pg16', '5 Novar Dr.', '2002-11-1','2003-8-10', 70);
insert into owner values('co40', 'tina', 'pg4');
insert into owner values('co93', 'tony', 'pg16');
insert into owner values('co93', 'tony', 'pg36');
insert into Client values('cr56','aline', 'pg4');
insert into Client values('cr56','aline', 'pg36');
insert into Client values('cr56','aline', 'pg16');
insert into Client values('cr76','john', 'pg4');
insert into Client values('cr76','john', 'pg16');
我正在尝试打印输出,如下所示
我尝试了下面的查询,得到了奇怪的结果:
Select c.client_No
, p.property_No
, c.client_Name
, p.p_address
, p.rent_start
, p.rent_finish
, DATEDIFF(p.rent_finish, p.rent_start) as Total_Days
, p.Rent_Per_Day
, DATEDIFF(p.rent_finish, p.rent_start)*p.Rent_Per_Day as Total_Rent
, o.owner_No
, o.owner_name
from Property p
right
join Client c
on p.property_no = c.property_no
left
join Owner o
on p.property_no = o.property_no
group
by property_no
, rent_start
order
by client_no desc
, property_no desc;
输出为:
感谢您的帮助。提前感谢。您的表格未正确正常化。在表“客户”和“物业”中,作为您的物业,您的物业编号也取决于租金的开始和结束。您的主要问题不是查询,而是表:
- 表无效,DBMS应拒绝create语句
- 您调用属性的表实际上是一个租用表,因为它的主键不是属性号,而是属性号加上租用时间。您应该考虑重命名表,因此读取查询的人们知道他们正在处理什么。
- 表客户端尝试引用属性表,但仅通过属性号进行引用。属性编号在属性表中不唯一。因此,不允许使用此引用(外键)
- 客户端表的主键似乎没有意义。为什么客户编号和客户名称都在密钥中?这意味着两者都可以有重复项(例如,多个客户机使用相同的编号,只要这些客户机具有不同的名称)。为什么钥匙上有财产号码?每家酒店都有自己的客户号吗?客户机甚至可以多次拥有一个属性,只要它们始终使用不同的名称
- 表所有者也是如此。您仅通过属性表键的一部分引用属性表,这应该是禁止的。然后,这似乎不是所有者表,而是所有者表,因为您不仅存储所有者(编号和名称),而且还存储属性。主键是所有者编号加上属性编号,这允许多个所有者共享同一个属性,并允许所有者对其每个属性使用不同的所有者名称。这看起来完全错了
- 请永远不要混合左右连接。这使得查询几乎无法读取。仅使用左外部联接(当然,仅当您确实想要外部联接时)
- 连接导致笛卡尔积,因为当您认为您正在处理一个属性表时,实际上您正在处理一个租金表,如上所述
- 查询无效,因为您仅按属性号和租金开始进行分组,但访问与该组无关的列。例如,允许property/rent表为这种组合包含许多行,所有行都具有不同的rent end(这当然是createtable语句中的另一个错误)。您还可以拥有多个客户来支付租金。等等。永远不要使用
分组依据
来修复查询中不理解的内容。仅在聚合时使用它(即具有聚合函数,例如
,MIN
anndMAX
)COUNT
总而言之:有很多问题需要解决。从桌子开始。读起来。物业应通过物业编号标识,业主应通过其业主编号标识,客户应通过其客户编号标识。(“Identified by”表示主键。)然后您将需要一个单独的表用于出租。那么这里的表结构和约束是什么呢。你能举例说明一下吗?这样我就可以参照这个来修正它了。提前感谢您的帮助。如前所述:物业应仅通过其物业编号进行标识。它有一个地址,可能还有一个所有者。它没有日期。你想试试这个,我告诉你你是否做对了?