Mysql 正在尝试按查询打印以下输出

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

我有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_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
    MAX
    annd
    COUNT

总而言之:有很多问题需要解决。从桌子开始。读起来。物业应通过物业编号标识,业主应通过其业主编号标识,客户应通过其客户编号标识。(“Identified by”表示主键。)然后您将需要一个单独的表用于出租。

那么这里的表结构和约束是什么呢。你能举例说明一下吗?这样我就可以参照这个来修正它了。提前感谢您的帮助。如前所述:物业应仅通过其物业编号进行标识。它有一个地址,可能还有一个所有者。它没有日期。你想试试这个,我告诉你你是否做对了?