2009-08-28 47 views
0

我有两个msyql表,徽章和事件。我用了一个连接以发现所有的事件,并返回徽章信息使用下面的代码的事件(标题&说明):在php(而不是mysql)中获取最大值

SELECT COUNT(Badges.badge_ID)AS BADGE_COUNT,标题,Badges.description FROM Badges JOIN Events ON Badges.badge_id = Events.badge_id GROUP BY 标题ASC

除了计数,我需要知道事件的最项的值。我以为我会用max()函数在php中执行此操作,但我无法正常工作。所以,我决定通过使用“ORDER BY badgecount DESC LIMIT 1”来修改上面的查询来得到相同的结果,它返回一个单个元素的数组,它的值是所有事件的最高计数总数。

虽然这个解决方案对我来说很好,但我很好奇它是否需要更多资源来进行2次调用服务器(b/c我现在使用两个查询),而不是在php中处理它。如果我是用php做的,我怎么能得到关联数组中某个特定项的最大值(如果可能的话,能够返回关键字和值将会很好)?

编辑: OK,这是惊人的什么休息几个小时就会为心灵做。今天早上我打开了我的代码,并对代码进行了简单的修改,这对我来说很合适。我只是在计数字段上创建了一个变量,如果新字符大于旧字符,则将其更改为新值(请参阅以下代码中的“if”语句):

if($ c> $ highestCount){ $ highestCount = $ c; }

+0

如果你担心(读)表现你有没有考虑到计算和存储冗余信息何时出现新条目? – VolkerK 2009-08-28 07:31:33

+0

看看这个非常类似的问题问不到15分钟前: http://stackoverflow.com/questions/1345307/php-retrieve-minimum-and-maximum-values-in-a-2d-associative-array – Amber 2009-08-28 06:33:27

回答

4

这可能会再次导致“宗教战争”,但我会去与两个查询版本。对我来说,尽可能在数据库中进行数据处理是更清洁的。从长远来看,查询缓存等可以解决额外查询造成的开销。

总之,要获得PHP最大,你只需要遍历您的$结果数组:

getMax($results) { 
    if (count($results) == 0) { 
    return NULL; 
    } 

    $max = reset($results); 
    for($results as $elem) { 
    if ($max < $elem) { // need to do specific comparison here 
     $max = $elem; 
    } 
    } 
    return $max; 
} 
+0

我同意2种查询方法。数据库调用在订购时非常快(只要列索引)和更高效的内存。 – ctcherry 2009-08-28 06:46:26

+0

我同意两个查询。基于索引参数(这可能意味着数据库引擎甚至不会读取所有这些值的磁盘),如果您的数据库服务器位于不同的计算机上,这也可以节省流量。 小心微观管理优化:) – 2009-08-28 07:22:58

+0

这与我今天上午做的事情类似。另外,感谢您对查询方法的看法。我知道这种后续行动可能属于另一个问题(很可能已被回答),但测试哪种方法资源最不密集的“最佳”方法是什么? – staypuffinpc 2009-08-28 16:59:12