代码之家  ›  专栏  ›  技术社区  ›  user_777

用group by条件联接两个表

  •  3
  • user_777  · 技术社区  · 6 年前

    Akbar Travels building      2018-10
    Thrikandiyur Quarters       2018-10
    
    
    Akbar Travels building     2018-11
    Thrikandiyur Quarters      2018-11
    

    这里有两个表名 table A,table B , table A

    category_id              category_name  
        5               Akbar Travels building          
        6               Thrikandiyur Quarters 
    

    table B 结构看起来像这样

    id     paying_month     parent_category     
    1         2018-10           5   
    2         2018-10           5   
    3         2018-11           5   
    4         2018-11           5   
    5         2018-10           6   
    

    public function get_date_wise_pdf_report($from, $to)
    {
           $query=$this->db->query("SELECT * from tableA A left join tableB B  on A.category_id = B.parent_category and B.paying_month BETWEEN '{$from}' AND '{$to}' ");
           return $query->result();
     }
    

    但是当我用这个的时候我就变成这样了

    Akbar Travels building     2018-10
    Akbar Travels building     2018-10
    Akbar Travels building     2018-11
    Akbar Travels building     2018-11
    Thrikandiyur Quarters      2018-10
    

    2 回复  |  直到 6 年前
        1
  •  4
  •   Fahmi    6 年前

    SELECT distinct A.category_name,B.paying_month
    from tableA A left join tableB B  on A.category_id = B.parent_category and 
    B.paying_month BETWEEN '{$from}' AND '{$to}'
    order by B.paying_month
    
        2
  •  1
  •   Jayendran    6 年前

    根据您的表格,“Thrikandiyur Quarters”仅与“2018-10”相关。因此,在您的输出中有一行:“Thrikandiyur Quarters 2018-11”您应该在表b中有一个如下的参考:

    id  ||   paying_month  ||   parent_category  
    6   ||    2018-11      ||    6 
    

    你使用的条件只是一个日期之间的间隔。为了得到一个不重复的输出,您应该在语句中加一个“DISTINCT”。这样地:

    $query=$this->db->query("SELECT DISTINCT * from tableA A left join tableB B  on 
    A.category_id = B.parent_category and B.paying_month BETWEEN '{$from}' AND 
    '{$to}' ");
    

    另一种解决方案是使用“分组依据”:

    $query=$this->db->query("SELECT * from tableA A left join tableB B  on 
    A.category_id = B.parent_category and B.paying_month BETWEEN '{$from}' AND 
    '{$to}' GROUP BY B.parent_category");