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.category
和members.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中包含类似名称的多个表中获取数据