MYSQL按发布日期和时间戳排序不规则


MYSQL order by publish date and timestamp irregularities

我试图根据新闻文章的发布日期和时间戳,使用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

这些都不起作用。。。

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

我要么错过了一些显而易见的事情(本周工作时间很长…),要么有一个更具创造性的方法。

谢谢你的帮助!

您的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。

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

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

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

SELECT NOW();

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

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

PHP函数time()返回Unix时间戳(自1970年1月1日午夜UTC以来的秒数)。MySQL函数FROM_UNIXTIME()和UNIX_TIMESTAMP()可用于从UNIX时间戳转换为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不支持函数索引)。

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

当按两列排序时,您将不会得到最新和最新的,您将得到按ORDER by子句中第一列排序的所有条目,并且只有当两行具有相同的值时,这两行才会按第二列排序。

你可以试试这是否如预期:

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

这将在最近的任何日期订购。