2011-10-10 134 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」中傳遞的,在這個查詢中,你可以得到所有的結果......是否與你需要的一樣? –

相關問題