Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/273.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php Mysql对于查询中的每个不同结果,运行另一个查询_Php_Mysql - Fatal编程技术网

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,而不是时间卡。因为所有优秀的程序员都很懒惰,这对我们的心理健康至关重要。