2012-10-01 112 views
0

我對MySQL比較陌生,我遇到了這個問題,我尋求幫助,但找不到答案(可能因爲我不知道要搜索什麼)。我確信有一個簡單的解決方案。PHP - MySQL的 - GROUP BY/ORDER BY?錯誤的結果輸出

我有一個簡單的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 

但是,這不是我所期待的結果。引用id 104719的ID和狀態應該是41和5,而不是37和2.

我無法弄清楚如何獲取每個referenceid的最新ID行輸出。

我注意到,在PHPMYADMIN中,(你可以在上面的表格中看到),這些ID以相反的順序列出,最新的ID在底部。我不確定這是否與這個問題有關。

我希望這是明確的,我相信這是一件簡單的事情。

謝謝您的閱讀。

詹姆斯

+0

你試過'ORDER BY ABS(ID)DESC' – Trey

+1

請停止使用'mysql_ *'功能因爲他們在[棄用流程](http://news.php.net/php.internals/53799)。 [成爲一名更好的PHP開發人員](http://jason.pureconcepts.net/2012/08/better-php-developer/)。 –

回答

4

從內存打字,所以你可能需要更正語法一點點,但這個概念,我認爲,應該工作。

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

適合我! http://sqlfiddle.com/#!2/b789b/2/0 :) –

+0

非常感謝,這個作品,我真的很感激你的時間! – James

+0

很高興有幫助:) ..也感謝特里爲sqlfiddle鏈接。不知道這個工具,它非常有用。 – Aman

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 
+0

感謝您的迴應,阿曼的解決方案似乎是最好的。 – James

1

嘗試......

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

這是不夠的,總是返回給定參考的最近'狀態'。隱藏的列問題(請參閱@Gordon答案) – kasi