左连接两个表的分区依据和某些特定条件

时间:2019-03-22 06:06:14

标签: sql join left-join

我想联接两个表,一个表是实际的表数据,另一个表是检查表,在该表中,我正在检查要在日期条件下加入两个表的内容。
表1包含大量数据,其中包含account_id,Partner_id,Dates和actual_review。
审核表是具有账户_id,合作伙伴_id,审核日期和recommended的数据的表。

我正在做的是注册一个帐户,然后对该帐户进行审核,然后在review_recommended中添加该审核。

Table 1:  
Id_partner | Id_account |    Date    |  actual_review  
    4      |   7009     | 2018/12/23 |     Good        
    4      |   7009     | 2018/12/25 |     Good    
    4      |   7009     | 2018/12/27 |     Good    
    4      |   7009     | 2018/12/31 |     Bad    
    4      |   7009     | 2019/01/10 |     Good    
    4      |   7009     | 2019/01/14 |     Good    
    4      |   7009     | 2019/01/16 |     Bad    
    4      |   7009     | 2019/02/12 |     Good    
    4      |   7009     | 2019/02/15 |     Good    
    4      |   7009     | 2019/02/18 |     Bad    
    4      |   7009     | 2019/02/25 |     Bad    
    4      |   7009     | 2019/03/05 |     Bad    
    4      |   7009     | 2019/03/06 |     Good    
    4      |   7009     | 2019/03/09 |     Good    
    4      |   7009     | 2019/03/12 |     Good    
    4      |   7009     | 2019/03/15 |     Bad    
    4      |   7009     | 2019/03/18 |     Bad    
    4      |   7009     | 2019/03/20 |     Good  

我考虑了一下,然后比他们的评论好还是坏 并在这些表中有不同的表格,我会在一段时间后对帐户进行审核,例如,如果我今天对帐户进行了审核,那么我可能会在某个时间或某天之后对该帐户进行审核

Review Table :  
Id_partner | Id_account | Date_review |  review_recommended  
   4       |   7009     | 2018/12/22  |     Good   
   4       |   7009     | 2019/01/20  |     Bad  
   4       |   7009     | 2019/02/16  |     Good  
   4       |   7009     | 2019/03/12  |     Bad  

我希望以这样一种方式联接两个表,直到再次对其进行复审之前,我需要review_recommended在下一个表之前保持一致

我尝试使用“左连接”进行操作,但由于它会连接大多数行,因此变得很困难

Table After Joining :
Id_partner | Id_account |    Date    |  actual_review | review_recommended  
    4      |   7009     | 2018/12/23 |     Good       |      Good  
    4      |   7009     | 2018/12/25 |     Good       |      Good  
    4      |   7009     | 2018/12/27 |     Good       |      Good  
    4      |   7009     | 2018/12/31 |     Bad        |      Good  
    4      |   7009     | 2019/01/10 |     Good       |      Good  
    4      |   7009     | 2019/01/14 |     Good       |      Good  
    4      |   7009     | 2019/01/16 |     Bad        |      Good  
    4      |   7009     | 2019/02/12 |     Good       |      Bad  
    4      |   7009     | 2019/02/15 |     Good       |      Bad  
    4      |   7009     | 2019/02/18 |     Bad        |      Good   
    4      |   7009     | 2019/02/25 |     Bad        |      Good   
    4      |   7009     | 2019/03/05 |     Bad        |      Good   
    4      |   7009     | 2019/03/06 |     Good       |      Good   
    4      |   7009     | 2019/03/09 |     Good       |      Good   
    4      |   7009     | 2019/03/12 |     Good       |      Good   
    4      |   7009     | 2019/03/15 |     Bad        |      Bad   
    4      |   7009     | 2019/03/18 |     Bad        |      Bad   
    4      |   7009     | 2019/03/20 |     Good       |      Bad   

由于表中有许多帐户和合作伙伴,因此已在id_accounts,id_partners,Date和Date_review上完成加入。 任何指导或帮助表示赞赏!

2 个答案:

答案 0 :(得分:0)

请尝试这个。

<input placeholder="myplaceholder" list="opts"/>
<datalist id="opts">
<option>One</option>
<option>Two</option>
<option>Three</option>
</datalist>

答案 1 :(得分:0)

这是在mysql中解决此问题的一种方法 test1是您的表1 而test2是您的评论表。

  

使用row_nmber可以更好地解决IT问题

但是由于您没有定义数据库版本并命名此更好的解决方案

select d.*,test1.actual_review, test2.review_recommended
FROM test2
inner join 
(
SELECT dates,
       Id_partner,
       Id_account,
       MAX(Date_review) AS Date_review
FROM (SELECT test1.*, test2.`Date_review`, test2.`review_recommended`
      FROM test1
           LEFT JOIN test2
              ON     test2.`Id_account` = test1.`Id_account`
                 AND test2.`Id_partner` = test1.`Id_partner`
      WHERE test1.Dates > test2.`Date_review`) DATA
GROUP BY dates, Id_partner, Id_account )d
ON test2.Date_review =d.Date_review 
inner join test1 on d.dates = test1.dates and d.Id_account = test1.Id_account and d.Id_partner = test1.Id_partner;
  

使用row_number编辑1

select * from (
select  data.*,row_number() over (partition by  Id_account,Id_partner,dates  order by Date_review desc  ) as sr_no from 
(SELECT test1.*, test2.`Date_review`, test2.`review_recommended`
      FROM test1
           LEFT JOIN test2
              ON     test2.`Id_account` = test1.`Id_account`
                 AND test2.`Id_partner` = test1.`Id_partner`
      WHERE test1.Dates > test2.`Date_review`) as data) as d 
      where d.sr_no =1;