我试图根据新闻文章的发布日期和时间戳,使用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
这将在最近的任何日期订购。