我正在尝试根据发布日期和新闻文章的时间戳使用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
这些都不起作用......
我可以列出一些结果,但我认为它可能有点多余。如果你想看到它们,请告诉我。
我要么缺少一些明显的东西(本周很长时间......),要么就是更有创意的方法。
感谢您的帮助!
答案 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
这将按更近期的日期排序。