Php MySql表上的自连接

Php MySql表上的自连接,php,mysql,join,Php,Mysql,Join,因此,我的数据库中有一些用户,他们每个人都可以向我们公司提交“推荐”。我正在创建一个表格,显示每个用户在当月和上月提交的推荐数量,以便我们可以跟踪他们是否是活跃的销售代表。虽然我成功地显示了给定用户的当月编号,但我一直很难正确显示上个月的信息。我得到了上个月的推荐数量,但每个用户的推荐数量都相同 |=========|========|==========|=============| |user_id refer_id referals date | |--------

因此,我的数据库中有一些用户,他们每个人都可以向我们公司提交“推荐”。我正在创建一个表格,显示每个用户在当月和上月提交的推荐数量,以便我们可以跟踪他们是否是活跃的销售代表。虽然我成功地显示了给定用户的当月编号,但我一直很难正确显示上个月的信息。我得到了上个月的推荐数量,但每个用户的推荐数量都相同

|=========|========|==========|=============|
|user_id   refer_id  referals      date     |
|-------------------------------------------|
|1             1     mcdonalds   2017-12-19 |
|1             2     Burger King 2017-12-19 |
|1             3     Wendys      2017-12-21 |
|1             4     Arby's      2017-12-22 |
|1             5     In n' out   2018-01-02 |
|2             6     Chipotle    2018-01-03
|2             7     Carl's jr.  2018-01-04 |
|===========================================|
用户1应该有1个转介,用户2应该有2个转介本月,这确实有效,用户1应该有4个转介前一个月,但我得到4返回每个用户。我还想将其浓缩为一个查询,但我不确定要使用哪种类型的联接,或者我甚至需要一个联接吗?我已经找到了关于自连接和内部连接的信息以及以前关于它的问题,但我不确定在我的案例中使用哪一个

  <table class="table table-hover">
    <thead>
      <tr>
        <th>Sales Name</th>
        <th>Current Month</th>
        <th>Previous Month</th>
      </tr>
    </thead>

    <?php   
      //CURRENT MONTH QUERY 

      $query = "SELECT user_id, COUNT(refer_id) AS refer_total
                FROM table
                WHERE MONTH(date) = MONTH(CURDATE()) GROUP BY user_id";
      $result = mysqli_query($connection, $query); 

      //PREVIOUS MONTH QUERY   

     $query2 = "SELECT user_id, COUNT(refer_id) AS previous_total
                 FROM table
                 WHERE 
                 YEAR(date) = YEAR(CURRENT_DATE - INTERVAL 1 MONTH) AND
                 MONTH(date) = MONTH(CURRENT_DATE - INTERVAL 1 MONTH) GROUP BY user_id";     
     $total = mysqli_query($connection, $query2);          

     while($values = mysqli_fetch_assoc($total)) {    
       $previous = $values['previous_total'];
     }

     while($values = mysqli_fetch_assoc($result)) { 
       $user_id = $values['user_id'];
       $num_refer = $values['refer_total'];
       echo "<tr><td>$user_id</td><td>$num_refer</td><td>$previous</td></tr>";
     }

     if(mysqli_num_rows < 5) {
       echo "Inactive!";
     }
  ?>
</table> <!--END TABLE-->

销售名称
当月
上月

您还需要使用日期函数按日期分组。在结果中显示当前月份是正确的唯一原因是每个用户当前月份有1个

mysql> select user_id, date_format(date,'%Y-%m'), count(*) from test group by user_id, date_format(date,'%Y-%m');
+---------+---------------------------+----------+
| user_id | date_format(date,'%Y-%m') | count(*) |
+---------+---------------------------+----------+
|       1 | 2017-12                   |        4 |
|       1 | 2018-01                   |        1 |
|       2 | 2018-01                   |        1 |
+---------+---------------------------+----------+
3 rows in set (0.00 sec)
事实上,我刚刚意识到这不是你想要的格式。类似于以下的方法应该可以工作:

mysql> select user_id, 
sum(case date_format(date,'%Y-%m') when date_format(curdate(),'%Y-%m') then 1 else 0 end) as current_month, 
sum(case date_format(date,'%Y-%m') when date_format(DATE_SUB(curdate(), INTERVAL 1 MONTH),'%Y-%m') then 1 else 0 end) as previous_month 
from test group by user_id;
+---------+---------------+----------------+
| user_id | current_month | previous_month |
+---------+---------------+----------------+
|       1 |             1 |              4 |
|       2 |             1 |              0 |
+---------+---------------+----------------+
2 rows in set (0.00 sec)

如果您的查询给出了正确的结果,则意味着您错误地遍历了查询。很抱歉,我没有在表中放置一行。用户1当月有1个转介,用户2当月有2个转介。当我按用户id进行分组时,它确实给出了这些数字,但它仍然为每个用户提供了4个数字,即使我按用户id、日期格式(日期、%Y-%m')进行分组。这真是太棒了!非常感谢你的帮助!我不熟悉这个案例的编码,所以我将对此做更多的研究,以便我能很好地理解它。它本质上是一个if。。。mysql的else语句。我更熟悉oraclesql和DECODE。这里是mysql文档案例的链接,非常感谢。我将阅读更多的案例陈述并做一些研究。这确实有助于在一个查询中保持所有内容的整洁。