mysql - 比较两个表后如何输出匹配?
问题描述
我想比较两张表。但我不知道该怎么办,因为我不够好。我想知道如何编写查询
no.1_table
id chart_num chart_name visit card_amount_received
1 4 user1 2020-04-05 1000
2 5 user2 2020-05-05 1000
3 5 user2 2020-05-05 1000
4 5 user2 2020-06-05 1000
5 6 user3 2020-07-05 1000
6 6 user3 2020-08-05 1000
7 7 user4 2020-09-05 1000
8 7 user4 2020-09-05 1000
no.2_table
id card_date advenced_amount
1 2020-04-05 17:28:00 1000
2 2020-05-05 12:12:12 2000
10 2020-11-05 12:12:12 5000
条件和顺序如下。
no.1_table,将每个chart_num的值相同的一列相加,访问。
将数字1的结果值的visit和card_count_received与no.2_table的card_date和advenced_amount值进行比较。
如果no.1_table的chart_num和visit的值与no.2_table的card_date和no.2_table的added_count值相同,则ok,否则输出错误,处理为null。
如何创建查询语句?
数据库技能不足。请给我答复。
解决方案
- no.1_table,将每个chart_num的值相同的一列相加,访问。
为此,您想要group by
chart_num 并访问。任何具有相同chart_num 和访问的行都将在结果中显示为单行。然后你可以sum
收到的金额,这将添加一个组的所有值。
select
chart_num,
visit,
sum(card_amount_received) as card_amount_received
from table1
group by chart_num, visit
chart_name
是个问题。您无法显示它,因为它不是group by
. sum
它是一个字符串,因此将它与类似or的函数聚合是没有意义的count
。尽管在数据中chart_num 具有相同的chart_name,但不能保证。
一种解决方案是使用group_concat
将组中的每个名称连接在一起。每个组应该只有一个名字。
select
chart_num,
visit,
group_concat(chart_name) as chart_name,
sum(card_amount_received) as card_amount_received
from table1
group by chart_num, visit
但是,正确的解决方案是修复架构。chart_name 是重复的,这是要避免的。相反,将图表列移动到它们自己的表中。然后要获取图表名称,请加入 chart_num。
create table charts (
id serial primary key,
name varchar(255) not null
);
insert into charts (id, name) values
(4, 'user1'), (5, 'user2'), (6, 'user3'), (7, 'user4');
alter table table1 drop column chart_name;
select
charts.id as chart_num,
visit,
charts.name as chart_name,
sum(card_amount_received) as card_amount_received
from table1
join charts on charts.id = chart_num
group by chart_num, visit
- 将数字1的结果值的visit和card_count_received与no.2_table的card_date和advanced_amount值进行比较。
我们需要一个左连接,第二个表匹配 card_date 和访问。左连接意味着“左”表(即from
表)中的所有行将始终出现,即使连接表中没有匹配项。
访问是一个日期。card_date 不是日期而是时间戳。为了匹配它们,我们需要转换card_date
为日期。
select
charts.id as chart_num,
visit,
charts.name as chart_name,
sum(card_amount_received) as card_amount_received,
table2.card_date,
table2.advanced_amount as amount
from table1
join charts on charts.id = chart_num
left join table2 on date(table2.chart_date) = visit
group by chart_num, visit
如果 no.1_table 的 chart_num 和 visit 的值与 no.2_table 的 card_date 和 no.2_table 的 added_count 值相同,则 ok 否则输出错误,处理为空。
我们需要将 advanced_amount 与 sum(card_amount_received) 进行比较。如果它们相等:好的。如果不是:错误。在标准 SQL 中,我们使用 a case
,但 MariaDB 有一个if
更加紧凑的非标准 SQL。
select
charts.id as chart_num,
visit,
charts.name as chart_name,
sum(card_amount_received) as card_amount_received,
table2.card_date,
table2.advanced_amount as amount,
if(table2.advanced_amount = sum(card_amount_received), 'ok', 'error') as result
from table1
join charts on charts.id = chart_num
left join table2 on date(table2.chart_date) = visit
group by chart_num, visit
推荐阅读
- r - 计算人口年龄四分位数范围并将结果存储为 R 中的数据框的最佳方法
- r - 将几个表连接在一起
- javascript - 尝试使用 Typescript 和 Parcel-Bundler 渲染 Google 地图时出错
- javascript - useEffect 在井字游戏中无法正常工作
- javascript - 调用 setState 时组件不会重新渲染
- c# - 使用 Blazor 和 XML 构建动态用户界面
- nuxt.js - 如何创建一个 nuxt 存储子模块,以便我可以使用与第二个实例相同的存储模块?
- java - Camel onCompletion 导致单元测试挂起
- qml - QML 和网络组装
- powershell - Powershell:具有多个参数的选项