Php 使用具有多个时间范围的单个查询从两个表中获取
我有两个表Php 使用具有多个时间范围的单个查询从两个表中获取,php,mysql,Php,Mysql,我有两个表report和report1 range count countapps 06:31:00-07:30:00 2 count from report1 5:30:00-6:30:00 2 count from report1 报告表格 id user dt 1 a 2014-06-23 05:30:00 2 b 2014-06-23 06:30:00 3
report
和report1
range count countapps
06:31:00-07:30:00 2 count from report1
5:30:00-6:30:00 2 count from report1
报告
表格
id user dt
1 a 2014-06-23 05:30:00
2 b 2014-06-23 06:30:00
3 c 2014-06-23 06:31:00
4 d 2014-06-23 07:30:00
user dt
a 2014-06-26 05:30:00
b 2014-06-26 06:00:00
要生成这样一个包含多个日期范围的报告,我做了
range count
06:31:00-07:30:00 2
5:30:00-6:30:00 2
file.php
$query=mysql_query("SELECT CASE
WHEN DATE_FORMAT(dt,'%H:%i:%s') BETWEEN '05:30:00' and '06:30:00' and DATE_FORMAT(dt,'%Y:%m:%d')=DATE(CURDATE())
THEN '5:30:00-6:30:00'
WHEN DATE_FORMAT(dt,'%H:%i:%s') BETWEEN '06:31:00' and '07:30:00' and DATE_FORMAT(dt,'%Y:%m:%d')=DATE(CURDATE())
THEN '06:31:00-07:30:00'
WHEN DATE_FORMAT(dt,'%H:%i:%s') BETWEEN '07:31:00' and '08:30:00' and DATE_FORMAT(dt,'%Y:%m:%d')=DATE(CURDATE())
THEN '07:30:00-08:30:00'
ELSE NULL
END AS TimeRange,
COUNT(*) as number
FROM report
GROUP BY TimeRange
HAVING TimeRange IS NOT NULL");
echo'<html>
<head>
<title>Count User Info TimeWise</title>
</head>
<h1>Count User</h1>
<table border="1" cellspacing="1">
<tr>
<th>range</th>
<th>count</th>
<th>Apps Count</th>';
while($row = mysql_fetch_array($query))
{
echo "<tr>";
echo "<td>" . $row['TimeRange'] . "</td>";
echo "<td>" . $row['number'] . "</td>";
echo "</tr>";
}
echo "</table>";
echo "</html>";
?>
report1
表格
id user dt
1 a 2014-06-23 05:30:00
2 b 2014-06-23 06:30:00
3 c 2014-06-23 06:31:00
4 d 2014-06-23 07:30:00
user dt
a 2014-06-26 05:30:00
b 2014-06-26 06:00:00
如何在单个查询中做到这一点我想我应该将当前查询用作子查询,并将其与另一个表连接起来(因为当前查询生成另一个表所键入的时间范围名称) 类似这样的情况,尽管您也需要将日期添加到子查询中(不确定要加入的日期-所有记录是否来自同一日期?)- 编辑-有点笨重,但想想这样的东西就可以了:-
SELECT sub0.TimeRange, sub0.number, COUNT(*) AS countapps
FROM
(
SELECT
CASE
WHEN DATE_FORMAT(dt,'%H:%i:%s') BETWEEN '05:30:00' and '06:30:00'
THEN STR_TO_DATE(CONCAT(CURDATE(), ' ', '05:30:00'), '%Y-%m-%d %H:%i:%s')
WHEN DATE_FORMAT(dt,'%H:%i:%s') BETWEEN '06:31:00' and '07:30:00'
THEN STR_TO_DATE(CONCAT(CURDATE(), ' ', '06:31:00'), '%Y-%m-%d %H:%i:%s')
WHEN DATE_FORMAT(dt,'%H:%i:%s') BETWEEN '07:31:00' and '08:30:00'
THEN STR_TO_DATE(CONCAT(CURDATE(), ' ', '07:30:00'), '%Y-%m-%d %H:%i:%s')
ELSE NULL
END AS StartRange,
CASE
WHEN DATE_FORMAT(dt,'%H:%i:%s') BETWEEN '05:30:00' and '06:30:00'
THEN STR_TO_DATE(CONCAT(CURDATE(), ' ', '06:30:00'), '%Y-%m-%d %H:%i:%s')
WHEN DATE_FORMAT(dt,'%H:%i:%s') BETWEEN '06:31:00' and '07:30:00'
THEN STR_TO_DATE(CONCAT(CURDATE(), ' ', '07:30:00'), '%Y-%m-%d %H:%i:%s')
WHEN DATE_FORMAT(dt,'%H:%i:%s') BETWEEN '07:31:00' and '08:30:00'
THEN STR_TO_DATE(CONCAT(CURDATE(), ' ', '08:30:00'), '%Y-%m-%d %H:%i:%s')
ELSE NULL
END AS EndRange,
CASE
WHEN DATE_FORMAT(dt,'%H:%i:%s') BETWEEN '05:30:00' and '06:30:00'
THEN '05:30:00-06:30:00'
WHEN DATE_FORMAT(dt,'%H:%i:%s') BETWEEN '06:31:00' and '07:30:00'
THEN '06:31:00-07:30:00'
WHEN DATE_FORMAT(dt,'%H:%i:%s') BETWEEN '07:31:00' and '08:30:00'
THEN '07:30:00-08:30:00'
ELSE NULL
END AS TimeRange,
COUNT(*) as number
FROM report
WHERE DATE_FORMAT(dt,'%Y:%m:%d')=DATE(CURDATE())
GROUP BY StartRange, EndRange, TimeRange
HAVING TimeRange IS NOT NULL
) sub0
LEFT OUTER JOIN report1
ON report1.dt BETWEEN sub0.StartRange AND sub0.EndRange
GROUP BY sub0.TimeRange, sub0.number
您希望如何更详细地加入report1?日期和时间何时与日期和开始时间匹配?或者时间是否在时间范围内?只需在每一行中添加此
和DATE_格式(dt,%Y:%m:%d')=DATE(CURDATE())
,即可获取时间范围和当前日期之间的每条记录。我已使用这些行编辑了我的问题。我测试了您的代码,但如果countapps列(report1.dt)中有一个值在给定的时间范围内找不到,它会显示上一个时间范围内的上一个值,并在所有较低的时间范围内循环它。这是不应该的。我看不出SQL是如何做到这一点的(尽管在处理结果的脚本中很容易做到这一点)。请在SQLFiddle上展示一组表和数据的示例来演示它好吗?