2010-05-12 55 views
1

我怎麼去顯示最新的帖子的時候我有兩個表,都含有一種叫做CREATION_DATE獲取的最新訊息根據日期

列這將是簡單的,如果我所要做的就是根據帖子created_on的值獲取最近的帖子,但是如果帖子包含回覆,我需要將這個因子納入等式。 如果帖子有最近的回覆我想獲得回覆created_on值,但也獲得帖子post_id和主題。

帖子表結構:

CREATE TABLE `posts` (
    `post_id` bigint(20) unsigned NOT NULL auto_increment, 
    `cat_id` bigint(20) NOT NULL, 
    `user_id` bigint(20) NOT NULL, 
    `subject` tinytext NOT NULL, 
    `comments` text NOT NULL, 
    `created_on` datetime NOT NULL, 
    `status` varchar(10) NOT NULL default 'INACTIVE', 
    `private_post` varchar(10) NOT NULL default 'PUBLIC', 
    `db_location` varchar(10) NOT NULL, 
    PRIMARY KEY (`post_id`) 
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=7 ; 

回覆表結構:

CREATE TABLE `replies` (
    `reply_id` bigint(20) unsigned NOT NULL auto_increment, 
    `post_id` bigint(20) NOT NULL, 
    `user_id` bigint(20) NOT NULL, 
    `comments` text NOT NULL, 
    `created_on` datetime NOT NULL, 
    `notify` varchar(5) NOT NULL default 'YES', 
    `status` varchar(10) NOT NULL default 'INACTIVE', 
    `db_location` varchar(10) NOT NULL, 
    PRIMARY KEY (`reply_id`) 
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=5 ; 

這裏是我的查詢爲止。我已經刪除了提取日期的嘗試。

$strQuery = "SELECT posts.post_id, posts.created_on, replies.created_on, posts.subject "; 
$strQuery = $strQuery."FROM posts ,replies "; 
$strQuery = $strQuery."WHERE posts.post_id = replies.post_id "; 
$strQuery = $strQuery."AND posts.cat_id = '".$row->cat_id."'"; 

回答

3
$strQuery = " 
    SELECT posts.post_id, GREATEST(posts.created_on, replies.created_on) AS latestDate, posts.subject 
    FROM posts, replies 
    WHERE posts.post_id = replies.post_id 
    AND posts.cat_id = {$row->cat_id} 
    GROUP BY posts.post_id 
    ORDER BY latestDate DESC; 
"; 

UPDATE:關於第二個外觀,上面實際上是不正確的,因爲它不包括還沒有任何回覆這些帖子。這樣做更正確的方法是:

$strQuery = " 
    SELECT posts.post_id, GREATEST(posts.created_on, replies.created_on) AS latestDate, 
    FROM posts 
    LEFT JOIN replies ON (posts.post_id = replies.post_id) 
    WHERE posts.cat_id = {$row->cat_id} 
    GROUP BY posts.post_id 
    ORDER BY latestDate DESC 
    LIMIT 0,1; 
"; 
+1

和它最近的文章中我會扔在一個'LIMIT 0,1' – 2010-05-12 08:22:47

+0

@DavidYell,良好的通話 – 2010-05-12 08:30:49

+1

在MySQL中,MAX()只接受一個參數,是一個聚合函數。 – ceteras 2010-05-12 09:13:32

1

SELECT posts.post_id,posts.subject,replies.post_id

來自帖子 LEFT JOIN答覆ON post.post_id = replies.post_id

WHERE posts.cat_id = '$行向> CAT_ID'

ORDER BY posts.post_id DESC,replies.post_id DESC

沒有答覆的將返回NULL,並且可以在輸出中使用PHP過濾掉。

0

獲取最新帖子,最近對帖子的回覆,然後獲取其中最近的帖子。

這使用order by created_on desc limit 1只從表中獲取最後一項。 我建議在created_on列上添加關鍵字,並在回覆表中爲post_id列添加關鍵字。

更新:也cat_id需要索引。

select * from (
select * from 
(
select p.post_id, p.created_on , 'post' as post_type 
from posts p 
where p.cat_id = '$row->cat_id' 
order by p.created_on desc limit 1 
)post 
union 
select * from 
(
select p.post_id, r.created_on , 'reply' 
from posts p 
inner join replies r on r.post_id = p.post_id 
where p.cat_id = '$row->cat_id' 
order by r.created_on desc limit 1 
)reply 
)big order by big.created_on limit 1;