【问题标题】:How to fetch data from multiple tables in SQLSQL如何从多个表中获取数据
【发布时间】:2019-02-18 21:06:06
【问题描述】:
create table customers
    (
    custID int(11) primary key, 
    customerName varchar(50),
    phone varchar(50),
    address varchar(50),
    state varchar(50),
    postalCode varchar(15),
    country varchar(50),
    creditLimit Decimal(10,2)
    );

create table product
(
    productID varchar(15) primary key,
    productName varchar(70),
    productVendor varchar(50),
    productDescription text,
    qtyInStock smallint(6),
    price Decimal(10,2)
);

create table orders
(
    orderNumber int(11) primary key,
    orderDate date,
    requiredDate date,
    shippedDate date,
    status varchar(15),
    comments text,
    custID int(11),
    salesID int(11),
    foreign key(custID) references customers(custID),
    foreign key(salesID) references salespersonnel(employeeID)
);

这里有三张表,我想获取一位特定客户的所有订单以及他们花费的总金额。

我在订单表和付款表中有两个条目

付款表:

订单表:

我正在执行这个查询

select count(p.orderNumber) as 'Total Orders', sum(amount) as 'Amount Spent'
from orders p,
     payments q
where p.custid = q.custid
  and q.custid = 1;

此查询正在生成双重结果 这意味着总共必须返回 2200 作为花费的总金额,但我得到 4400 客户总共下了 2 个订单,但我得到了 4 个。请帮助

【问题讨论】:

  • 我认为一个简单的GROUP BY 应该可以帮助你
  • 今日提示:切换到现代、明确的JOIN 语法。更容易编写(没有错误),更容易阅读(和维护),并且在需要时更容易转换为外连接。
  • 如何在这个表上使用join,你能帮我解决一下吗

标签: mysql sql


【解决方案1】:

您需要加入ordernumber 列上的2 个表:

select 
  count(o.orderNumber) as 'Total Orders', 
  sum(p.amount) as 'Amount Spent'
from orders o inner join payment p
on p.ordernumber = o.ordernumber
where o.custid = 1

demo 如果您想为每个客户获得这些总和:

select
  o.custid,
  count(o.orderNumber) as 'Total Orders', 
  sum(p.amount) as 'Amount Spent'
from orders o inner join payment p
on p.ordernumber = o.ordernumber
group by o.custid

【讨论】:

    【解决方案2】:

    您需要在加入之前聚合。否则,您将得到笛卡尔积(以及您看到的错误结果):

    select o.custid, o.Total_Orders, p.Amount_Spent
    from (select o.cust_id, count(*) as total_orders
          from orders o
          group by o.custid
         ) o left join 
         (select p.cust_id, sum(amount) as amount_spent
          from payments p
          group by p.cust_id
         ) p
         on p.custid = o.custid ;
    

    您可以添加WHERE 子句来过滤结果。您可以在外部查询或子查询中执行此操作。从性能的角度来看,后者更好。

    注意事项:

    • 从不FROM 子句中使用逗号。 始终使用正确、明确、标准 JOIN 语法。
    • 使用有意义的表别名。 p for orders 而不是 payments 只是令人困惑。
    • 仅在列别名中使用字母、数字和下划线,因此不必对它们进行转义。

    【讨论】:

    • 语法错误:(
    猜你喜欢
    • 2017-03-22
    • 2012-01-21
    • 2020-11-29
    • 2012-02-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-22
    • 1970-01-01
    相关资源
    最近更新 更多