2010-05-08 19 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

相关问题