2010-01-02 54 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