2017-08-10 87 views
0

我只想通過MS Access數據庫來解決我現在面臨的問題。實際上,我可以從簡單的查詢語句中獲得結果,但是每當我使用聚合和/或分組函數時,我都會收到錯誤消息。集合和分組函數的MS Access查詢錯誤

$rowno = 1; 

$query = "SELECT COL1, MIN(COL2) AS time_in, MAX(COL2) AS time_out FROM TBL 
     WHERE FORMAT(COL2, 'yyyy') = '2017' 
     GROUP BY COL1 
     ORDER BY COL2 DESC"; 

foreach ($dbh->query($query) as $row){ 
    echo $rowno . ") " . $row['COL1'] . " - " . $row['time_in'] . " - " . $row['time_out'] . "<br/>"; 
    $rowno++; 
} 

,這讓我:

警告:)...中

我的困惑是,爲什麼功能不工作時的foreach(提供參數無效實際上相同的查詢語句與另一個MS Access數據庫一起工作?這是數據還是版本問題?聲明正在工作,當我刪除MIN(),MAX()GROUP BY的東西。

但無論如何,這裏是一個可以在數據庫我目前使用被看作一個簡單的數據:

COL1   COL2 
1  8/10/2017 4:53:31 PM 
1  8/10/2017 4:50:31 PM 
2  8/10/2017 4:43:31 PM 
2  8/10/2017 4:40:31 PM 
3  8/10/2017 4:33:31 PM 
3  8/10/2017 4:30:31 PM 
+0

這段編程是PHP,我猜。你如何連接PHP和MS Access?這與MySQL有什麼關係(因爲它被標記)? –

+0

@ErikvonAsmuth我認爲這與PHP無關。問題出在查詢語句本身。連接很好,我使用的是一個PDO ODBC的東西。好吧,我會刪除MySQL(我只是困惑)。 – rhavendc

+0

您是在Windows上運行您的PHP,還是您在使用Linux的第三方ODBC驅動程序? –

回答

2

你的ORDER BY語句不是一個聚集體,當你使用總計查詢。這應該工作:

$query = "SELECT COL1, MIN(COL2) AS time_in, MAX(COL2) AS time_out FROM TBL 
     WHERE FORMAT(COL2, 'yyyy') = '2017' 
     GROUP BY COL1 
     ORDER BY MIN(COL2) DESC"; 

如果您的訂單不是彙總,可能會發生衝突。假設你有如下表:

COL1   COL2 
1  8/10/2017 4:53:31 PM 
1  8/10/2017 4:50:31 PM 
2  8/10/2017 4:59:31 PM 
2  8/10/2017 4:40:31 PM 

如果你只是爲了這個由COL2,訪問不知道是否應該把集聚行的COL1: 1之前或之後COL1: 2,因爲對於COL1:2COL2既是高(在第3行)和更低(在第4行)比COL1: 1

+0

是的,它的工作!但是如何?這只是我第一次在ORDER BY中使用聚合,因爲這只是我第一次遇到像這樣的問題。那是因爲日期格式?也許? – rhavendc

+0

不,您正在使用總計查詢,這意味着它會彙總每行的結果。如果在總計查詢中使用ORDER BY,則必須使用聚合(如min,sum,max等)或使用也在GROUP BY語句中的列。 –

+0

哦。這很奇怪,因爲相同的查詢語句與另一個Access數據庫正常工作(不使用ORDER BY中的聚合)。但無論如何,這是一個值得記住的教訓。謝謝你,先生! – rhavendc