MySQL选择其列总和相等的行

Posted

技术标签:

【中文标题】MySQL选择其列总和相等的行【英文标题】:MySQL select rows where its columns sum equal value 【发布时间】:2015-10-17 09:32:29 【问题描述】:

我有以下表格:

答:

+----+-----------+-------+----------+
| ID | PaymentID | Price | Quantity |
+----+-----------+-------+----------+
|  1 |         1 |   128 |        1 |
|  2 |         2 |    10 |        2 |
|  3 |         2 |    11 |        1 |
|  4 |         3 |   100 |        2 |
+----+-----------+-------+----------+

乙:

+-----------+------------+
| PaymentID | TotalPrice |
+-----------+------------+
|         1 |        128 |
|         2 |         31 |
|         3 |        201 |
+-----------+------------+

并查询:

SELECT a.ID
FROM a
LEFT JOIN b ON b.PaymentID = a.PaymentID
WHERE b.TotalPrice = (a.Price * a.Quantity)

当 a.PaymentID 是唯一的,但表 A 中的一些交易被分开并一起支付(表 B)时,它可以正常工作。上面的查询返回 a.ID = 1 但我需要返回 a.ID = 1,2,3。

a.PaymentID(1): 128 * 1 = 128 MATCH
a.PaymentID(2): 10 * 2 + 11 * 1 = 31 MATCH
a.PaymentID(3): 100 * 2 = 200 NOT MATCH

SQL Fiddle

【问题讨论】:

为什么你need to return a.ID = 1,2,3. 你的预期输出是什么? 为什么你期望 ID =3?这里的总价格不等于价格 * 数量? 为什么需要表B?你需要保持它是正确的。您可以通过简单的 SQL 检索它。 SELECT PaymentID, sum(Price*Quantity) FROM A WHERE PaymentID = 2 GROUP BY PaymentID 表 A 中的交易从表 B 中分离出来 (PaymentID = 2) => 10*2 + 11*1 = 31。表 A 是交易列表,表 B 是从银行帐户生成的,我需要返回与收到的付款匹配的交易。 顺便提一下,这将呈现为 INNER JOIN。 【参考方案1】:

试试这个说法:

SELECT a.ID, b.totalprice
FROM a
LEFT JOIN b ON b.PaymentID = a.PaymentID
group by b.paymentID
having TotalPrice = sum(a.Price * a.Quantity)

SQLFIDDLE

更新:澄清后:

select a.id from a where paymentId in(
  select paymentID from(
SELECT a.paymentID as paymentID, b.totalprice
FROM a
LEFT JOIN b ON b.PaymentID = a.PaymentID
group by b.paymentID
having TotalPrice = sum(a.Price * a.Quantity)) as c )

【讨论】:

现在可以使用了。但是@Abhik 解决方案似乎更适合我的需求。无论如何,感谢您的耐心等待。【参考方案2】:

您正在尝试将表 a 中的价格和金额的总和与 PaymentId 一起连接到表 b,并将其用于连接子句,该子句将基于每行而不是基于聚合来计算。 你可能需要先找到聚合部分,然后加入一些东西作为

select
a.ID
from a 
left join (
  select sum(Price*Quantity) as tot,PaymentID 
  from a group by PaymentID
)x on x.PaymentID = a.PaymentID
join b on b.PaymentID = a.PaymentID and x.tot = b.TotalPrice

http://www.sqlfiddle.com/#!9/3b261/45

【讨论】:

以上是关于MySQL选择其列总和相等的行的主要内容,如果未能解决你的问题,请参考以下文章

MySQL - 根据用户的选择选择列'名称'列'id'和'parent'中的行彼此相等

选择总和直到设定数量,然后更新mysql数据库中的字段

从表中选择不同的记录并执行重复行的列总和(托盘、总和)。并显示重复的行一次[关闭]

SQL选择列的总和最大的行(在GROUP BY中有两个字段)

选择字符串中子串最长的行

MySQL:在一列中选择多列和总和