从表中提取最新帖子

时间:2014-02-25 01:00:16

标签: php mysql max

所有

我正在尝试显示作者的最新帖子。

帖子在一个表中,作者在另一个表中。使用的查询是:加入名为content_id的列,我正在尝试使用MAX(item_date),这是帖子发布的日期。

以下是我正在运行的一些查询和输出,除了所有作者的最新帖子外,我似乎得到了所有内容:

首先(这一点有效)我们需要获取有关作者的信息:

$query="SELECT content_id, title, source_image, url FROM content_detail where approved='y'"; 
$result1 = $mysqli->query($query) or die($mysqli->error.__LINE__); 

// GOING THROUGH THE DATA 
if($result1->num_rows > 0) { 


while($fetch=mysqli_fetch_array($result1)) { 
$title=$fetch['title']; 
$feed_rss=$fetch['url']; 
$content_id=$fetch['content_id']; 
$source_image=$fetch['source_image']; 

现在,在此基础上,让我们得到帖子,第1轮:

$query2 = "SELECT item_id, item_title, MAX(item_date) as item_date from posts WHERE content_id='$content_id' GROUP BY content_id"; 
$result2 = $mysqli->query($query2) or die($mysqli->error.__LINE__); 

if($result2->num_rows > 0) { 

while($rows2=mysqli_fetch_array($result2)) {   

$item_id = $rows2['item_id']; 
$item_title = $rows2['item_title']; 
$item_date = $rows2['item_date'];  `

这会收回一组有趣的结果,即作者发表的最新日期,但不是最新的标题!

我尝试过GROUP BY item_title和content_id无济于事。

以下内容只回溯了数据库中有多个日期的记录,问题是(因为这是新的)一些作者只有一个帖子,这些都没有显示:

$query2 = "SELECT item_id, item_title, item_date FROM posts AS a WHERE content_id = content_id  AND item_date = ( 
    SELECT MAX(item_date) 
    FROM rssingest AS b 
)  
";

我试过了:

ORDER BY DATE DESC LIMIT 1

在我的查询结束时无济于事。

item_date是表格中的DATE类型。

非常感谢任何帮助!

谢谢,

2 个答案:

答案 0 :(得分:1)

您需要将自己的帖子表连接到自己,以便只抓取每个content_id的最新帖子(我相信是作者)。

$query2 = "SELECT posts.item_id, posts.item_title, posts.item_date  from posts 
join (select max(item_id) max_id, content_id from posts group by content_id) maxid
on maxid.content_id=posts.content_id and maxid.max_id=posts.item_id
WHERE content_id='$content_id' "; 

这为进一步优化打开了大门。你可以在一次运行中抓住作者和他们的最后一篇文章。

SELECT content_detail.content_id, 
content_detail.title, 
content_detail.source_image, 
content_detail.url , 
posts.item_id, 
posts.item_title, 
posts.item_date
FROM content_detail 
join posts on content_detail.content_id=posts.content_id
join (select max(item_id) max_id, content_id from posts group by content_id) maxid
on maxid.content_id=posts.content_id and maxid.max_id=posts.item_id
where content_detail.approved='y'

但这可能是夸大其词。你当然应该自己尝试一下:)

答案 1 :(得分:1)

您正在运行此查询以获取最长日期:

SELECT item_id, item_title, MAX(item_date) as item_date
from posts
WHERE content_id = '$content_id'
GROUP BY content_id;

当然你没有得到正确的item_title。它没有在group by子句中提及,也没有聚合函数。因此,您正在使用MySQL扩展(此查询将在其他数据库中失败)。

您可以使用substring_index() / group_concat()技巧获取最新的标题:

SELECT max(item_id),
       substring_index(group_concat(item_title separator '|' order by item_date desc), '|', 1) as last_title, 
       MAX(item_date) as item_date
from posts
WHERE content_id = '$content_id'
GROUP BY content_id;

这将返回一行。但是,如果只有一行,你可以这样做:

SELECT p.*
from posts p
WHERE p.content_id = '$content_id'
ORDER BY item_date desc
LIMIT 1;

如果添加group by语句,则会推广以前的版本。