sql从多个表中获取数据

Posted

技术标签:

【中文标题】sql从多个表中获取数据【英文标题】:Getting data from multiple tables in sql 【发布时间】: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 SQL Inner-join with 3 tables?的可能重复 @jarlh 预期结果是“单值”代表特定客户的 Invoice 总金额。 【参考方案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
             );

【讨论】:

仍然返回双倍值:(

以上是关于sql从多个表中获取数据的主要内容,如果未能解决你的问题,请参考以下文章

如何从 SQL Server 中特定数据库的表中获取所有列名?

如何编写一个查询以从SQL Server中包含类似名称的多个表中获取数据

如何从多个SQL表中获取值并在html / php表中显示?

SQL查询从数据中获取最新价格?

SQL查询从多个表返回数据

从 2 个表中获取数据到 excel 表中