MYSQL按发布日期和时间戳的顺序排列

时间:2011-05-26 14:38:48

标签: php mysql date timestamp

我正在尝试根据发布日期和新闻文章的时间戳使用php和mysql列出新闻。我需要列出所有文章的最新发布日期和最新的时间戳。当我试图完成这个时,我在列表中遇到了一些不正常之处。

需要注意的是,一些新闻文章的时间戳可能是今天,但是发布日期为10。

SELECT * FROM table_news WHERE pubdate <= ".time()." ORDER BY pubdate,date DESC

SELECT * FROM table_news WHERE pubdate <= ".time()." ORDER BY date,pubdate DESC

SELECT * FROM table_news WHERE pubdate <= ".time()." ORDER BY pubdate,date ASC

SELECT * FROM table_news WHERE pubdate <= ".time()." ORDER BY date,pubdate ASC

这些都不起作用......

我可以列出一些结果,但我认为它可能有点多余。如果你想看到它们,请告诉我。

我要么缺少一些明显的东西(本周很长时间......),要么就是更有创意的方法。

感谢您的帮助!

4 个答案:

答案 0 :(得分:4)

您的pubdate字段是unix时间映射(例如整数字段)还是实际的mysql日期/时间字段? time()返回一个unix时间戳,而不是日期/时间字符串。请改用:

SELECT *
FROM table_news
WHERE pubdate <= now()
ORDER BY pubdate DESC, date DESC

请注意order by子句中两个字段的DESC。除非在order-by子句中的每个字段上明确指定asc / desc,否则SQL指定默认为ASC。

答案 1 :(得分:1)

SELECT * FROM table_news WHERE pubdate <= NOW() ORDER BY pubdate,date DESC

PHP的time()将当前时间作为Unix时间戳返回,该时间戳使用的格式与MySQL时间戳非常不同。您可以使用NOW()来获取MySQL中的当前时间戳。

答案 2 :(得分:1)

您需要在查询字符串中使用MySQL格式的日期。尝试

SELECT NOW();

查看MySQL格式的日期是什么样的。您可能希望直接在查询中使用NOW()函数,而不是使用PHP time()函数。

SELECT * FROM table_news WHERE pubdate <= NOW() ORDER BY ...

PHP函数time()返回一个Unix时间戳(自UTC时间1970年1月1日午夜起的秒数)。 MySQL函数FROM_UNIXTIME()和UNIX_TIMESTAMP()可用于转换和转换为Unix时间戳。

为了能够使用索引,您所比较的列的名称必须是独立使用的,不能在函数中使用。也就是说,

SELECT * FROM table_news WHERE pubdate < FROM_UNIXTIME(1306421037)

可以在pubdate上使用索引,但

SELECT * FROM table_news WHERE unix_timestamp(pubdate) < 1306421037

不能在pubdate上使用索引,因为索引在pubdate而不在unix_timestamp(pubdate)上(MySQL不支持功能索引)。

答案 3 :(得分:1)

我猜这里,但我想我知道你期望ORDER BY做什么。

按两列排序时,您将无法获得最新和最新的列,您将获得该ORDER BY子句中第一列所排序的所有条目,并且只有当两行具有相同的值时,这两个行才会按顺序排序第二栏。

如果按预期方式工作,您可以尝试:

SELECT *
FROM table_news
WHERE pubdate <= ".time()."
ORDER BY MAX(pubdate,date) DESC

这将按更近期的日期排序。