2010-05-08 20 views
1

好的,我的語句在phpMyAdmin中執行得很好,但不是我期望它在我的PHP頁面。選擇*,最大(日期)在phpMyAdmin工作,但不在我的代碼

這是我的發言:

SELECT `egid`, `group_name` , `limit`, MAX(`date`) 
    FROM employee_groups 
GROUP BY `egid` 
ORDER BY `egid` DESC ; 

這是5月表:

CREATE TABLE `employee_groups` (
    `egid` int(10) unsigned NOT NULL, 
    `date` date NOT NULL, 
    `group_name` varchar(50) NOT NULL, 
    `limit` smallint(5) unsigned NOT NULL, 
    PRIMARY KEY (`egid`,`date`) 
) ENGINE=MyISAM DEFAULT CHARSET=cp1251; 

我想提取最新的羣體,如清單如果一個組被改變了,我只想要最後的改變。我需要它作爲一個列表(所有組)。

+2

你可以發佈選擇它像PHP的任何其他科拉姆你正在使用的PHP代碼? – awgy 2010-05-08 11:25:19

+0

「不是我期望的」你期望什麼,你得到了什麼?再次標記 – 2010-05-08 13:45:06

回答

1

您的查詢可能已中斷。除非滿足以下兩個條件之一,否則不應選擇不在組中的字段:

  • 您使用聚合函數。
  • 該值在功能上依賴於按列分組。

兩個領域group_namelimit出現違反這些規則。這意味着您將獲得這些列的不確定結果。

如果您嘗試選擇每個組的最大值,那麼您應該使用稍微不同的技術。請參閱Quassnoi的文章MYSQL: Selecting records holding a groupwise maximum,瞭解您可以使用的各種方法。

下面是做這件事:

SELECT di.* 
FROM (
     SELECT egid, MAX(date) AS date 
     FROM  employee_groups d 
     GROUP BY egid 
     ) dd 
JOIN employee_groups di 
ON  di.egid = dd.egid AND di.date = dd.date 
+0

。這是mysql。在mysql中,你可以使用集合函數來選擇組外的字段。我知道這在標準的sql和大多數實現中都不起作用,但是它在_mysql_中工作(實際返回的行是未定義的[大部分時間是第一行],但它編譯,工作並返回結果集!) – knittl 2010-05-08 13:32:53

+0

這工程太棒了!謝謝。我在其他三個論壇發佈了我的問題,但沒有人能夠幫助我。你是個聰明人,馬克。 – kdobrev 2010-05-09 09:34:32

+0

@kdobrev:很高興幫助。請記住在問題解決後接受答案。接受答案將鼓勵這裏的人們更多地幫助你。 :) – 2010-05-09 10:01:11

0

聚合功能將在MySQL工作,SQL標準不同。訪問的max(date)從PHP的價值,你有別名它:

SELECT `egid`, `group_name` , `limit`, MAX(`date`) as maxdate 
FROM … 

然後你可以

while($row = mysqli_fetch_row($result)) { 
    echo htmlspecialchars($row['maxdate']); 
} 

希望幫助

+0

Mark的回答是我一直在尋找的。不管怎麼說,還是要謝謝你。 – kdobrev 2010-05-09 09:36:20

相關問題