2010-01-02 42 views
2

我堅持以下查詢,它不會按日期排序。任何幫助,或對我做錯什麼的洞察力將不勝感激。該查詢應該通過thread_id獲得一個條目,然後在線程中顯示最新的帖子,就像使用論壇帖子一樣,它很好。但是當我嘗試使用ORDER BY子句將結果從最新到最舊排序時,它似乎忽略它。Mysql查詢不會ORDER BY日期

$query = "SELECT * 
      FROM messages 
      WHERE (thread_id, received) 
      IN (SELECT thread_id, MAX(received) 
       FROM messages 
       WHERE receiver='$user' OR sender='$user' 
        AND is_hidden_receiver!='1' 
       GROUP BY thread_id) 
      ORDER BY received DESC"; 

乾杯,LEA

+2

沒有意義 - 'SELECT *'包含'received'列,這是某些數據庫的要求。所以'ORDER BY received DESC'應該可以工作。 – 2010-01-02 02:50:30

+1

「received」字段的實際數據類型是什麼? – Mike 2010-01-02 02:53:24

+0

您正在使用哪個版本的MySQL,以及在哪個平臺上?從表面上看,假設'received'列實際上是日期/時間類型,沒有理由不工作 - 其他可能不是MySQL中的錯誤。 – 2010-01-02 02:54:47

回答

2

您正在使用PHP time()函數生成一個值插入到INT(11)列。我有點迷惑,爲什麼這是不正確的排序。如果我想清楚如何簡潔地解釋它,我會更新這個答案。

此功能內置於MySQL,它是TIMESTAMP列的類型。在對此解決方案感到滿意之前,您應該可能使用read up on it a bit more。它具有一些有趣的屬性,具體取決於如何定義表格,TIMESTAMP類型的列可以用作創建時間戳或修改時間戳。

0

是不是真的沒有被「接受」排序,或者你只是得到不同的結果比預期的問題?它可能是where子句的操作順序 - 我不確定AND和OR是否優先。也許嘗試改變這一點:

receiver='$user' OR sender='$user' AND is_hidden_receiver!='1' 

取其這些你想要的一個:

(receiver='$user' OR sender='$user') AND is_hidden_receiver!='1' 

receiver='$user' OR (sender='$user' AND is_hidden_receiver!='1') 
+0

沒有括號就是'receiver ='$ user'OR(sender ='$ user'AND is_hidden_​​receiver!='1')' – 2010-01-02 02:56:44

+0

謝謝,我從來沒有記得那些東西(我總是使用parens時,混合和和或或只是爲了安全) – Jenni 2010-01-02 02:58:03

+1

我同意包圍混合AND和OR條款的情緒 - 並說盡可能多的評論 - 但這可能不是麻煩的根源。 – 2010-01-02 03:03:03