2011-10-10 95 views
1

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

$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]"); 

的原因,我做这种方式,是因为我不能按日期alone-有人搜索可能时钟晚上11:30一天,时钟输出凌晨1:00下面的“日子”。通过独特的打卡时间搜索,即使它与真正的日历“日”重叠,我也可以在“工作日”中完成总工作时间。

+0

在您的查询中由punch_period使用组,以便它可以为重复的punch_period生成一次记录。 – punit

+0

明白了!谢谢。 – Oseer

回答

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 tc.id, tc.punch_time, tc.punch_period .... 

混合&&AND
请勿混用&&AND,只需使用和混合混乱,&&是不是标准的SQL IIRC。

+0

对于SELECT *反模式+1,你不能强调这一点:) – phil

+0

我没有得到所有这些每个人都在他们的例子前缀。 tc。,tc2等是什么?我只是想了解这些前缀是什么... – Oseer

+0

它们不是前缀,它们是别名。你使用一个表的别名,否则不可能两次引用table1,现在你可以通过调用t1来引用table1(第一个实例),并通过调用t2来引用第二个实例。它也允许你缩短表名,所以你可以输入tc而不是时间卡,时间更短。而且因为所有优秀的程序员都懒惰,这对我们的心理健康至关重要。 – Johan

0

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

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

难道这仍然没有(在上面的例子中)6个查询? – Oseer

+0

SELECT * FROM timecards WHERE emp_id ='1'&& punch_period in(SELECT punch_period FROM timecards WHERE emp_id ='1'&& punch_time BETWEEN'$ start'AND'$ end'ORDER BY punch_time))........ ...........看到它,在这里你已经得到了所有punch_period值,这是在“in”中传递的,在这个查询中,你可以得到所有的结果......是否与你需要的一样? –

相关问题