Php Mysql对于查询中的每个不同结果,运行另一个查询
如何编写针对查询中每个不同结果执行的查询?为了说明这一点,我运行了一个查询来查找日期范围内的所有打卡周期:Php Mysql对于查询中的每个不同结果,运行另一个查询,php,mysql,Php,Mysql,如何编写针对查询中每个不同结果执行的查询?为了说明这一点,我运行了一个查询来查找日期范围内的所有打卡周期: $search_date = mysql_query("SELECT punch_period FROM timecards WHERE emp_id ='1' && punch_time BETWEE
$search_date = mysql_query("SELECT punch_period
FROM timecards
WHERE emp_id ='1' &&
punch_time BETWEEN '$start' AND '$end'
ORDER BY punch_time");
while($periods = mysql_fetch_array($search_date)) {
// run another query for each different punch_period
}
结果可能是1,1,1,1,2,2。我需要为每个不同的打孔周期运行第二个查询2次,而不是为每个结果运行第二个查询6次。它将类似于:
$punches = mysql_query("SELECT * FROM timecards
WHERE emp_id ='1' &&
punch_period = [RESULT FROM 1ST QUERY]");
我这样做的原因是因为我不能单独按日期搜索-有人可能会在某天晚上11:30打卡,然后在第二天凌晨1:00打卡。通过按唯一的打卡周期进行搜索,我可以得到一个工作日的总工作小时数,即使它与真实的日历日重叠。您只需使用“in”操作符即可
$punches = mysql_query("SELECT * FROM timecards
WHERE emp_id ='1' &&
punch_period in ( RESULT FROM 1ST QUERY)");
我看不出while循环的目的。 您只是在ping数据库服务器。 使用subselect在一个查询中获取所有行要快得多
SELECT DISTINCT tc.* FROM timecards tc
WHERE tc.emp_id = '1'
AND tc.punch_period IN (SELECT DISTINCT tc2.punch_period
FROM timecards tc2
WHERE tc2.emp_id ='1'
AND tc2.punch_time BETWEEN '$start' AND '$end')
ORDER BY punch_time
显然,您可以将此查询简化为:
SELECT DISTINCT tc.* FROM timecards tc
WHERE tc.emp_id = '1'
AND tc.punch_time BETWEEN '$start' AND '$end'
不建议选择*
请注意,SELECT*被视为反模式,最好显式命名要选择的字段
SELECT tc.id, tc.punch_time, tc.punch_period ....
混合和
不要混合使用&&和,只要使用,这种混合会让人困惑,&&不是标准的SQLIIRC 在查询中使用group by punch_period,这样它就可以为重复的punch_period生成一次记录。在上面的6个查询示例中,这不是仍然可以吗?请选择*FROM timecards WHERE emp_id='1'&punch_period in SELECT punch_period FROM timecards WHERE emp_id='1'&punch_time FROM'$start'和'$end'ORDER by打孔时间。。。。。。。。。。。。。。。。。。。看,这里你已经得到了所有的打孔周期值,这是传入的,在这个查询中,你可以得到所有的结果。。。这和你需要的一样吗?+1对于SELECT*反模式,你再强调也不为过:我没有得到所有人在他们的示例中使用的所有前缀。tc、tc2等是怎么回事。?我只是想了解这些前缀的用途…它们不是前缀,而是别名。您可以为表使用别名,因为否则不可能两次引用table1,现在可以通过调用t1引用table1第一个实例,通过调用t2引用第二个实例。它还允许您缩短表名,因此您可以键入更短的tc,而不是时间卡。因为所有优秀的程序员都很懒惰,这对我们的心理健康至关重要。