Mysql为查询中的每个不同结果,运行另一个查询

时间:2011-10-10 18:10:30

标签: php mysql

如何编写针对查询中的每个不同结果执行的查询?为了解释,我运行一个查询来查找日期范围内的所有“punch_periods”:

$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。我不需要运行第二次查询6次(对于每个结果),而是需要运行第二次查询2次(对于每个不同的punch_period)。它将类似于:

$punches = mysql_query("SELECT * FROM timecards 
                        WHERE emp_id ='1' && 
                        punch_period = [RESULT FROM 1ST QUERY]"); 

我这样做的原因是因为我无法单独按日期搜索 - 某人可能会在某天晚上11:30进入,并在下一个“日”凌晨1:00退出。通过独特的打卡周期搜索,我可以在“工作日”中获得总工作时间,即使它与真正的日历“日”重叠。

2 个答案:

答案 0 :(得分:3)

我没有看到while循环的目的 你只是在ping数据库服务器 使用子选择

在一个查询中获取所有行要快得多
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 *被视为反模式,最好明确指定要选择的字段。

SELECT tc.id, tc.punch_time, tc.punch_period ....

混合&&AND
不要混用&&AND,只需使用AND,混合令人困惑,&&不是标准的SQL IIRC。

答案 1 :(得分:0)

您可以简单地使用'in'运算符。

$punches = mysql_query("SELECT * FROM timecards 
                        WHERE emp_id ='1' && 
                        punch_period in ( RESULT FROM 1ST QUERY)");