2013-02-07 57 views
8

我被困在一个查询在mysql中。我被困在一个查询在mysql中

我想从表

  • 获取最近期的评论的评论应该是最近的评论的博客
  • 博客应该是最新的3个博客。只有当他们的状态是启用

记录应该像表的表博客这个
enter image description here enter image description here enter image description here 表结构

  • 显示评论&博客


     
    blog_id int - primary (auto increment) 
    blog_title  -varchar 
    blog_desc  -varchar 
    blog_image  -varchar 
    blog_tags  -varchar 
    tot_comments  -int 
    blog_creater  -varchar 
    blog_create_date -datetime 
    blog_status  -enum ('Enable','Disable') 
    

    为表表结构blog_comment


     
    comment_id  -int (auto increment) 
    fk_blog_id  -int 
    comment   -varchar 
    comment_by  -varchar 
    email   -varchar 
    comment_date  -datetime 
    comment_status -enum ('Enable','Disable') 
    

    及以下查询我写的,但我得到的结果是错误的。

    SELECT b.blog_title,b.blog_image, bc.* 
    FROM blog_comments bc, blog b 
    WHERE bc.comment_status='Enable' 
    AND b.blog_status='Enable' 
    AND b.blog_id=bc.fk_blog_id 
    GROUP BY bc.fk_blog_id  
    ORDER BY bc.comment_date DESC 
    LIMIT 0,3 
    

    输出


    enter image description here

  • +1

    +1对于您提出问题的方式;非常干净的描述 –

    +0

    @IonutFlaviusPogacian:的确,除了标题是... – Mr47

    +0

    这个群组的所有结果都从那个博客变成了一个单独的行;因此,你没有得到所有评论的列表.. – Luceos

    回答

    1

    为此,简单的解决方案将执行2查询您的结果。第一个查询获得博客帖子结果

    $db_blog="select blog_id,blog_title from blog where blog_ststus='Enable'"; 
    $que=mysql_query($db_blog); 
    while($row=mysql_fetch_object($que)) 
    { 
        echo $row->blog_title; 
        $db_comment="select comment from blog_comments where fk_blog_id=".$row->blog_id." and comment_status='Enable' order by comment_date desc"; 
        $quec=mysql_query($db_comment); 
        while($comment=mysql_fetch_object($quec)) 
        { 
         echo $comment->comment; 
        } 
    } 
    
    +0

    非常感谢,它的工作!非常感谢你。但是你知道如何从一个查询中得到结果吗 –

    +0

    你不应该在while循环中放置一个查询。 这可能会非常危险并且会导致性能下降。 对于第一个查询的每个结果,您将触发一个新的查询。如果第一个查询返回9个结果,您将执行9个额外的查询。使用2个查询不是一种选择,而是在while循环之外移除第二个查询,并利用第一个查询的结果! –

    +0

    @AlpeshTrivedi我会尝试在单个查询中做到这一点。如果我成功了,我会在这里发布它。 – ripa

    0

    尝试

    SELECT b.blog_title,b.blog_image, bc.* 
    FROM blog_comments AS bc, blog AS b 
    WHERE bc.comment_status='Enable' 
    AND b.blog_status='Enable' 
    AND b.blog_id=bc.fk_blog_id 
    GROUP BY bc.fk_blog_id  
    ORDER BY bc.comment_date DESC 
    LIMIT 0,3; 
    

    (我不是100%确定)

    +0

    感谢您的回复......但这是我试过的同一个查询! –

    +0

    我得到错误的结果,从这个查询... :( –

    +0

    我想“AS”是问题。对不起。 – keks

    1
    SELECT b.blog_title,b.blog_image, bc.* 
    FROM blog b 
    left join (
    Select * from 
    blog_comments bc 
    WHERE bc.comment_status='Enable' 
    GROUP BY bc.fk_blog_id  
    having max(bc.comment_date) = bc.comment_date 
    ) bcc on b.blog_id=bcc.fk_blog_id 
    where 
    b.blog_status='Enable' 
    ORDER BY b.blog_create_date desc 
    LIMIT 0,3 
    

    试试这个

    +0

    谢谢,但这个查询返回我只有一行数据库..... –

    +0

    我想顶部3个博客和1个博客上的最新评论 –

    +0

    你去那里修改 – Techmonk

    0
    SELECT b.blog_title,b.blog_image, bc.* 
    FROM blog_comments bc JOIN blog b ON bc.fk_blog_id = b.blog_id 
    WHERE bc.comment_status='Enable' 
    AND b.blog_status='Enable' 
    GROUP BY bc.fk_blog_id  
    ORDER BY bc.comment_date DESC 
    LIMIT 0,3 
    
    1

    试试这个:

    SELECT * FROM blog_comments bc, blog b 
    WHERE `bc.comment_status`='Enable' 
    AND `b.blog_status`='Enable' 
    AND `b.blog_id`=bc.fk_blog_id 
    ORDER BY `bc.comment_date` DESC LIMIT 1; 
    

    尝试一个更简单的一个:

    SELECT * FROM `blog_comment` WHERE 'blog_status'='Enable' AND 'blog_id'='$blogidherefromtitle' ORDER BY 'comment_date' DESC LIMIT1 
    
    +0

    博客表缺少这个查询... :) –

    0

    尝试此查询

    SELECT 
        bc.* 
    FROM 
        blog AS b 
        INNER JOIN (SELECT id , MAX(id) AS MaxID FROM blog) AS bl ON bl.id = b.id 
        LEFT JOIN blog_comment AS bc ON bc.fk_blog_id = b.id 
    ORDER BY bc.comment_id DESC 
    LIMIT 3  
    

    个EDITS:

    SELECT 
        bc.* 
    FROM 
        blog AS b 
        INNER JOIN (SELECT id , MAX(id) AS MaxID FROM blog GROUP BY id) AS bl ON bl.id = b.id 
        INNER JOIN (SELECT MAX(id) , fk_blog_id FROM blog_comment GROUP BY id) AS bc ON bc.fk_blog_id = b.id 
    ORDER BY bc.comment_id DESC 
    LIMIT 3 
    

    这是使用内部连接将获取最新的博客每个博客

    这里3个最新的博客和最新单曲评论。比加入评论和命令他们与日期或ID和限制他们根据您的要求。

    +0

    谢谢,但这是一个错误:#1054 - 'on子句'中的未知列'bl.MAX' #1054 - 'on子句'中的未知列'bl.MAX' –

    +0

    确定让我编辑它 –

    +0

    @AlpeshTrivedi你有没有再试过我编辑? –

    0
    select b.blog_title, b.blog_image, bc.* 
    from blog b join 
    (select bc.* 
    from bc join (select fk_blog_id, max(comment_date) latest_date 
           from blog_comment 
           where comment_status = 'Enable' 
           group by fk_blog_id) latest 
    on bc.fk_blog_id = latest.fk_blog_id and bc.comment_date = latest_date) c 
    on b.blog_id = c.fk_blog_id 
    where b.blog_status = 'Enable' 
    order by c.comment_date desc 
    limit 0, 3 
    

    c子查询中找到与每个博客的最新评论的行,使用链接的问题的技术。然后加入blog表以获取适当的博客数据。

    +0

    出错: - #1051 - 未知表'bc' –

    +0

    修正了它。它在查询的那部分被称为'c'。 – Barmar