比较这两个表不会产生预期的结果。我该如何解决?
Posted
技术标签:
【中文标题】比较这两个表不会产生预期的结果。我该如何解决?【英文标题】:Comparing the two tables does not produce the desired result. How can I fix it? 【发布时间】:2020-04-13 06:48:33 【问题描述】:我想比较两张表。 但是,它们不是在同一日期进行比较的。
1.表名:hospital_payment_data
id chart_num chart_name visit card_amount_received
1 9740 t1 2019-01-02 500
2 9740 t1 2019-01-02 500
3 23143 t2 2019-01-02 2000
4 14220 t3 2019-01-02 3000
2.表名:credit_card
id card_date advenced_amount
1 2019-01-02 1000
2 2020-01-02 2000
3 2020-01-02 3000
3.table 名称:图表
id name
9740 t1
23143 t2
14220 t3
当我发送查询时,我得到以下信息:
select
charts.id as chart_num,
visit,
charts.name as chart_name,
sum(card_amount_received) as card_amount_received,
credit_card.card_date,
credit_card.amount as amount,
if(credit_card.amount = sum(card_amount_received), 'ok', 'error') as result
from hospital_payment_data
join charts on charts.id = chart_num
left join credit_card on date(credit_card.card_date) = visit
group by chart_num, visit
错误的结果:
我想要结果
如何解决我的查询?请帮帮我。
【问题讨论】:
你的错误结果和预期的结果是一样的 修改完成 常见的JOIN乘法。在子查询中计算总和,然后加入另一个表。 我认为您在 credit_card 表中缺少一列,因为除了日期之外,无法将此表记录链接到 hospital_payment_data 表中的任何卡。这里应该有另一个外键链接到记录所属的卡 @Akina 你能详细解释一下吗? 【参考方案1】:这是常见的 JOIN 乘法。在子查询中计算总和,然后加入另一个表。
你能给我解释一下吗? – 用户 1082164
想象有一张桌子
id val
1 100
1 200
val
的总和是 300。
想象一下还有一张桌子
id txt
1 'A'
1 'B'
由id
加入第一个。连接第一个表的每一行时,将连接到第二个表的每个匹配行:
SELECT id, val, txt FROM t1 JOIN t2 USING (id);
id val txt
1 100 'A'
1 200 'A'
1 100 'B'
1 200 'B'
现在val
在加入聚集体中的总和是 600 - 它乘以每个连接。
为了得到正确的和,我们必须首先在子查询中对单个表求和(不加入乘法效应),然后将另一个表加入求和子查询。
PS。我不会编辑您的查询 - 它与 ONLY_FULL_GROUP_BY 设置不匹配。
【讨论】:
谢谢。我会试试的。 我认为该答案不适用于该问题,因为表之间没有ID链接。 @Tajniak 一些链接存在 - 所以它是适用的。它不是主键。如您所见,id
是一个通用字段(它甚至不是唯一的)。想象一下,它的名字不是id
,而是some_column
。
但我们无法链接hospital_payment_data.id
和credit_card.id
。如果是这样,那么表 hospital_payment_data
中的 id 2 也应该是 1。我们可以链接此数据的唯一方法是按日期。而且这个表中似乎有 2 个键。
@Tajniak 我的答案目标不是解决 OP 的问题 - 我只解释为什么总和值会增加。也许你知道等于用过的“JOIN 乘法”这个词,不需要额外解释?【参考方案2】:
您的表结构无效。您在表credit_card
中的数据应该是可识别的,并且您应该将付款与债务联系起来。目前有两种解决方案。
将新列 card_id
或 chart_num_id
添加到表 credit_card
。然后,如果您在向该表中添加行时无法执行此操作,则可以定期运行脚本,将 card_id
的值分配给卡。但是...如果有 2 笔 2000 美元的债务,而您只会收到一笔 2000 美元的付款,该怎么办。如果没有有关该付款的其他信息,就不可能将一笔付款分配给正确的 ID。
每天按日期分组检查付款而不是卡片。您可以通过检查每天的付款总额来修改 SQL 脚本。现在您可以在chart_num
上分组付款,而是可以在card_date
和visit
上分组。
您仍然可以构造有效的 SQL 查询,但非常复杂,我完全不明白为什么这比 1. 想法更可取。几乎没有任何利润的大量努力。
【讨论】:
你能详细解释一下你的提及吗? 我编辑了我的答案。您想详细了解什么解决方案?以上是关于比较这两个表不会产生预期的结果。我该如何解决?的主要内容,如果未能解决你的问题,请参考以下文章
比较 object.Value = Null 不会产生预期的结果
MYSQL LAST_INSERT_ID 未按预期工作。我该如何解决?