Mysql 在sql中从多个表获取数据

Mysql 在sql中从多个表获取数据,mysql,sql,Mysql,Sql,表1:发票(库存id、库存价值、客户id) 表2:客户(客户id、销售代表) 表3:成员(成员id、成员类别、成员类型、客户id) 注1:每个客户支付多张发票。(一对多关系)。 注2:每个客户为一个或多个成员付费(因此多个成员可能与一个客户相关)。 注3:每个成员有一个类别,可以是1“代表个人”或2“代表团体”。 注4:每个成员的类型可以是1“表示新”或2“表示更新” 我想获得销售代表=1及其成员类别=10及其成员类型的客户的发票价值字段的总数=123 例如:如果这些客户的销售代表是1,而他们支

表1:发票(库存id、库存价值、客户id)
表2:客户(客户id、销售代表)
表3:成员(成员id、成员类别、成员类型、客户id)

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

我想获得
销售代表
=1及其
成员类别
=10及其
成员类型
的客户的
发票价值
字段的总数
=123
例如:如果这些客户的销售代表是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}";

但两者都返回发票金额的两倍。
例:发票表中120美元的1张发票使用这些sql查询返回240美元

如何解决此问题?

这是您的问题:

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;
客户ID也可能在
客户
中重复

假设重复项仅在
成员中
,将查询更改为
存在

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}
             );

似乎您是从
发票
中获取
库存值
,它与
客户
多对一关系,但
客户
表和
成员
表有一对多关系

假设你有以下数据

发票表

invoices.cust_id    invoices.inv_value
custid1                 100
customer.cust_id
custid1
members.cust_id     members.category
custid1                 1
custid1                 2
客户表

invoices.cust_id    invoices.inv_value
custid1                 100
customer.cust_id
custid1
members.cust_id     members.category
custid1                 1
custid1                 2
成员表

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
如果您注意到在2
member\u类别中存在
custid1
发票价值也会重复

要解决这个问题,首先可以获取不同的记录,然后对这些不同的记录求和将帮助您解决问题,如下所示

解决方案

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});

添加提供不同返回/预期结果的示例表数据。(以及格式良好的文本。)提供表架构、表之间的关系、样本数据和预期结果确保
成员中没有重复。类别
成员。键入
对于相同的
客户id
可能重复的@jarlh,预期结果为“单一值”表示特定客户的发票总金额。仍然返回双倍的值:(请检查您的代码。我认为这是合理的,但运行时出现错误,没有返回值。mysqli_fetch_assoc()参数1应为mysqli_result,布尔值,因为错误可能是由于您在代码中使用的方式造成的。请检查