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文档案例的链接,非常感谢。我将阅读更多的案例陈述并做一些研究。这确实有助于在一个查询中保持所有内容的整洁。