当前位置: 首页 > 知识库问答 >
问题:

从sql中的多个表中获取数据

唐威
2023-03-14

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

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

我想为sales_rep=1、member_category=10、 members_type=123的客户获取

我试过了:

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 查询,发票表中的 1 张 120 美元的发票返回 240 美元。

我该如何解决这个问题?

共有2个答案

松元明
2023-03-14

您似乎是从< code >发票中提取< code>inv_value,它与< code >客户有多对一关系,但< code >客户表和< code >成员表有一对多关系。

说你有以下数据

发票表

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

如果您注意到<;code>;custid1<;/code>;存在于2<;code;membercategory<;/code<;中,<;代码>;发票值>;也会重复。

要解决这个问题,首先可以获取不同的记录,然后将这些不同的记录相加将有助于解决问题,如下所示

解决方案

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});
皇甫学海
2023-03-14

这是你的疑问:

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

假设重复项仅存在于成员中,请将查询更改为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}
             );
 类似资料:
  • 问题内容: 我有两个表: 这是表1: 这是表2: 现在,我想从这些表中获取数据。在两个表中都相同。 我想拿 和其他表。 请帮我做到这一点。 问题答案: 我假设您在第二个表中有一个命名字段(您没有列出它): 您应该查看有关的MySQL手册,因为这是编写SQL查询的非常基本的部分。您也可以考虑为product_id字段添加索引,以使查询运行更快。

  • 问题内容: 使用SQL SERVER。 数据库包含不同年份的数据,我想以某种方式获取所有数据(所有年份)并显示给用户,例如,数据库包含表: 现在通过从information_schema.tables中选择TABLE_NAME到@tableName中,其中table_name如’records_%’ 我可以获取所有表名,如何编写SQL(或过程)以从这些表中获取所有数据?将所有记录合并到一个表中?

  • 问题内容: 我有三个表,其中两个是主表,另一个是map。它们在下面给出。 tbl_Category,具有列ID(PK)和名称 / * / tbl_SubCategory Id SubCategoryName CategoryId (FK, PK of above) 2 Badges, Emblems, Ribbons & Allied 2 3 Barcodes, Stickers & Labels

  • 问题内容: 我在单个SQL语句中从多个表中提取Sums时遇到问题。 我有三个表tblCases,tblTimesheetEntries和tblInvoices在tblCases和其他两个表之间存在一对多的关系。 我目前正在使用以下SQL语句 但是,这似乎重复了发票金额。例如,如果一个案例只有一张发票,但是说有4个时间表条目,则它将计算出发票金额的4倍作为该表的总和。 如果我将分组取出,然后运行以下

  • 问题内容: 假设有两个表: 表A 表B 表之间的联系是 messageID 字段。 我想要一个查询来生成这样的结果,在该查询中,我将所有字段从表A中拉出,并对表B中每条消息的注释数进行计数,如下所示: 我已经尝试过这样的事情: 但这是行不通的。有任何想法吗?似乎应该可以在一个查询中执行此操作。我正在使用MSSQL。谢谢你的帮助。 问题答案: 标量子查询将起作用: 与往常一样,有很多方法可以改变这只