PHP - MySQL - GROUP BY / ORDER BY?错误的结果输出

时间:2012-10-01 20:44:30

标签: php mysql

我对MySQL很新,我有这个问题,我已经搜索过了,但是找不到答案(可能是因为我不确定要搜索什么)。我相信有一个简单的解决方案。

我有一个像这样的简单MySQL表:

id   |   referenceid   |   status
40       104702            4
39       104720            2
38       104720            0
37       104719            2
36       104719            0
35       104702            2
34       104702            0
41       104719            5

我想获取一个将产生以下输出的数组:

对于每个唯一的“referenceid”字段,我想知道最高的“ID”(即最近的)及其“状态”。

所以我尝试了这个查询:

$result = mysql_query(
  "SELECT status,id,referenceid 
   FROM image_status_tracking 
   GROUP BY referenceid",$db);

while ($row = mysql_fetch_array($result)) {
  $id = $row['id'];
  $status = $row['status'];
  $referenceid = $row['referenceid'];
  echo "ID $id, REFID $referenceid, Status $status <br />";
}

给出了这个输出:

ID 40, REFID 104702, Status 4

ID 37, REFID 104719, Status 2

ID 39, REFID 104720, Status 2 

但这不是我希望的结果。 referenceid 104719的ID和状态应为41和5,而不是37和2.

我无法弄清楚如何为每个referenceid获取最新的ID行输出。

我注意到的一些东西,在PHPMYADMIN中,(您可以在上表中看到),ID以相反的顺序列出,最新的ID位于底部。我不确定这是否与这个问题有关。

我希望这很清楚,我确信这是一件简单的事情。

感谢您的阅读。

詹姆斯

3 个答案:

答案 0 :(得分:4)

从内存中键入内容,这样你可能需要稍微纠正一下语法,但我认为这个概念应该有效。

select * 
  from image_status_tracking 
 where id in (
              select max(id) from image_status_tracking 
              GROUP BY referenceid
             )

答案 1 :(得分:1)

您的查询无法执行您想要的操作。对于每个引用ID,它选择随机ID和状态。这是MySQL的(错误)功能,称为隐藏列。

你想要的更像是:

select ist.*
from image_status_tracking ist join
     (SELECT referenceid, max(id) as maxid
      FROM image_status_tracking 
      GROUP BY referenceid
    ) r
    on ist.referenceid = r.referenceid

答案 2 :(得分:1)

试试这个......

 SELECT MAX(ID), Status From image_status_tracking 
       GROUP BY referenceid