【问题标题】:Getting data from multiple tables in sqlsql从多个表中获取数据
【发布时间】:2017-03-22 00:10:22
【问题描述】:

表 1:发票(inv_id、inv_value、cust_id)
表 2:客户(cust_id、sales_rep)
表 3:成员(Member_id、member_cateogry、member_type、cust_id)

注 1:每位客户支付多张发票。 (一对多关系)。
注 2:每位客户为一位或多位会员付费(因此一位以上的会员可能与一位客户相关)。
注 3:每个成员都有一个类别,可以是 1“代表个人”或 2“代表团体”。
注 4:每个成员都有一个类型,可以是 1“代表新”或 2“代表续订”。

我想为sales_rep = 1 和他们的member_category = 10 和他们的members_type = 123 的客户获取Invoice_value 字段的总和
例如:如果这些客户的 Sales_rep 为 1,并且他们支付的会员是新会员和个人会员,客户支付的发票总额是多少。

我试过了:

SELECT Sum(invoices.inv_value) AS total
FROM   invoices,
       customers,
       members
WHERE  invoices.cust_id = customers.cust_id
AND    members.custid = customers.cust_id
AND    members.category = {$category}
AND    members_type = {$type}
AND    customers.sales_rep = {$id}";

SELECT     Sum(invoices.inv_value) AS total
FROM       members
INNER JOIN customers
ON         members.custid = customers.cust_id
INNER JOIN invoices
ON         customers.cust_id = invoices.cust_id
WHERE      customers.sales_rep = {$id}
AND        members.category = {$category}
AND        members.type = {$type}";

但两者都返回双倍的发票值。
例如:使用这些 sql 查询,Invoices 表中 1 美元 120 美元的发票返回 240 美元。

我该如何解决这个问题?

【问题讨论】:

  • 添加样本表数据,给出不同的返回/预期结果。 (以及格式化文本。)
  • 提供表格架构、表格之间的关系、示例数据和您的预期结果
  • 确保members.categorymembers.type中没有重复的customer_id
  • @jarlh 预期结果是“单值”代表特定客户的 Invoice 总金额。

标签: mysql sql


【解决方案1】:

您似乎从invoices 中获取inv_value,它与customers 具有多对一 关系,但customer 表和members 表具有一对许多关系。

假设您有以下数据

发票表

invoices.cust_id    invoices.inv_value
custid1                 100

客户表

customer.cust_id
custid1

成员表

members.cust_id     members.category
custid1                 1
custid1                 2

加入所有三个表

customer.cust_id    members.cust_id         invoices.inv_value  members.category
custid1                 custid1                 100                 1
custid1                 custid1                 100                 2

如果您注意到custid1 存在于2 个member_category 中,则invoice value 也会重复。

要解决这个问题,首先您可以获取不同的记录,然后将这些不同的记录相加将帮助您解决以下问题

解决方案

SELECT Sum(invoices.inv_value) AS total
FROM(
    SELECT DISTINCT members.custid, invoices.inv_value inv_value
    FROM  members
    INNER JOIN customers
    ON members.custid = customers.cust_id
    INNER JOIN invoices
    ON customers.cust_id = invoices.cust_id
    WHERE customers.sales_rep = {$id}
    AND members.category = {$category}
    AND members.type = {$type});

【讨论】:

  • 请您检查您的代码。我认为这是有道理的,但是当我运行它时出现错误并且没有返回值。
  • mysqli_fetch_assoc() 期望参数 1 为 mysqli_result,给定布尔值
  • 该错误可能是由于您在代码中使用的方式造成的。请检查this
【解决方案2】:

这是您的查询:

SELECT sum(i.inv_value) as total
FROM members m INNER JOIN
     customers c
     ON m.custid = c.cust_id INNER JOIN
     invoices i
     ON c.cust_id = i.cust_id
WHERE c.sales_rep = {$id} AND 
      m.category = {$category} AND
      m.type = {$type}";

(不要使用带有逗号的隐式JOIN 语法。它过时且功能较弱。)

问题可能是两个成员可以拥有相同的客户 ID。您可以通过运行来检查:

select m.cust_id, count(*)
from members m
group by m.cust_id
having count(*) > 1;

customers 中的客户 ID 也可能重复。

假设重复项仅在members,将查询更改为exists

SELECT sum(i.inv_value) as total
FROM customers c
     ON  INNER JOIN
     invoices i
     ON c.cust_id = i.cust_id
WHERE c.sales_rep = {$id} AND 
      EXISTS (SELECT 1
              FROM members m
              WHERE m.custid = c.cust_id AND
                    m.category = {$category} AND
                    m.type = {$type}
             );

【讨论】:

  • 仍然返回双倍值:(
猜你喜欢
  • 2020-11-29
  • 1970-01-01
  • 1970-01-01
  • 2012-01-21
  • 2017-07-08
  • 2016-06-24
  • 2018-03-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多