2011-05-26 30 views
1

我想基於發佈日期和新聞文章的時間戳使用php和mysql列出新聞。我需要用最新的發佈日期和最新的時間戳列出所有文章。當我嘗試完成此操作時,我在列表中遇到了一些違規行爲。通過發佈日期和時間戳違規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

您的pubdate字段是unix時間戳(例如整數字段)還是實際的mysql日期/時間字段? time()返回一個unix時間戳,而不是日期/時間字符串。改爲:

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

請注意DESC在order by子句中的兩個字段上。除非您在order by子句中的每個字段上明確指定asc/desc,否則SQL指定默認爲ASC。

+0

是的,這是一個unix時間戳。沒意識到我可以通過選項分開訂購。現在試試這個! – 2011-05-26 14:45:52

+0

謝謝,你是那個人。 – 2011-05-26 15:18:46

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

PHP的time()將當前時間作爲Unix時間戳返回,該時間戳使用與MySQL時間戳非常不同的格式。您可以使用NOW()獲取MySQL中的當前時間戳。

1

您需要在查詢字符串中使用MySQL格式的日期。嘗試

SELECT NOW(); 

查看MySQL格式化日期的樣子。您可能希望直接在查詢中使用NOW()函數,而不是使用PHP time()函數。

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

PHP函數time()返回一個Unix時間戳(從1970年1月1日午夜開始的秒數)。 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不支持功能指標)。

1

我在這裏猜測,但我想我知道你期望ORDER BY做什麼。

當按兩列排序時,您將不會獲得最新的和最新的,您將獲得該ORDER BY子句中第一列排序的所有條目,並且只有兩行具有相同的值時,纔會排序這兩個在第二欄。

你可以試試,如果這個工程按預期:

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

這將通過的任何日期是最近的訂單。