如何编写针对查询中的每个不同结果执行的查询?为了解释,我运行一个查询来查找日期范围内的所有“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退出。通过独特的打卡周期搜索,我可以在“工作日”中获得总工作时间,即使它与真正的日历“日”重叠。
答案 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)");