首页 > 解决方案 > 比较两个表后如何输出匹配?

问题描述

我想比较两张表。但我不知道该怎么办,因为我不够好。我想知道如何编写查询

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              

想要结果 在此处输入图像描述

条件和顺序如下。

  1. no.1_table,将每个chart_num的值相同的一列相加,访问。

  2. 将数字1的结果值的visit和card_count_received与no.2_table的card_date和advenced_amount值进行比较。

  3. 如果no.1_table的chart_num和visit的值与no.2_table的card_date和no.2_table的added_count值相同,则ok,否则输出错误,处理为null。

如何创建查询语句?

数据库技能不足。请给我答复。

标签: mysqldatabasemariadb

解决方案


  1. no.1_table,将每个chart_num的值相同的一列相加,访问。

为此,您想要group bychart_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. 将数字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

推荐阅读