代码之家  ›  专栏  ›  技术社区  ›  oliverbj

MySQL/PDO-从其他表中选择(Join语句)

  •  0
  • oliverbj  · 技术社区  · 11 年前

    我有一个PDO语句,它从一些不同的表中选择一些数据。虽然,我不确定如何从另一个表中选择数据:

    SELECT 
            c.forum_id as category_id,
            c.forum_name as category_name,
            t.forum_id as id,
            t.forum_name as name,
            t.forum_desc as description,
            (SELECT COUNT(*) FROM forum_topics WHERE forum_id=t.forum_id AND topic_deleted=0) as topics_count,
            (SELECT COUNT(*) FROM forum_posts WHERE forum_id=t.forum_id AND post_deleted=0) as posts_count,
            (SELECT COUNT(*) FROM forum_posts WHERE topic_id=lp.topic_id AND post_deleted=0) as last_post_count,
            lp.topic_id as last_post_topic_id,
            lp.topic_title as last_post_topic_title,
            lp.post_time as last_post_time,
            lp.username as last_post_username
        FROM forum_cats as t
        JOIN forum_cats as c on c.forum_id = t.forum_type_id
        left join (
            SELECT 
                ft.topic_id,
                ft.title as topic_title,
                tmp.post_time,
                u.username,
                fp.forum_id
            FROM
                forum_posts fp
                join forum_topics ft on ft.topic_id = fp.topic_id
                join users u on u.id = fp.userid
                join (
                    select forum_id, max(`post_time`) `post_time`
                    from forum_posts fp
                    where fp.post_deleted = 0
                    group by forum_id
                    ) as tmp on (fp.forum_id = tmp.forum_id and fp.post_time = tmp.post_time)
            where post_deleted = 0 and ft.topic_deleted = 0
        ) as lp on lp.forum_id = t.forum_id
        where t.forum_active = 1 and c.forum_active = 1
        order by category_id, t.forum_id
    ");
    

    现在,我要选择列 avatar . users 哪里 username . 用户 是= last_post_username ( 阿凡达 列,从 用户 表)。

    我完全不知道从哪里开始。我应该这样写吗?

    (SELECT avatar FROM users WHERE username=last_post_username)
    

    但这不起作用。

    感谢任何帮助。

    1 回复  |  直到 11 年前
        1
  •  0
  •   Eric    11 年前

    你已经有了“last_post_username”,基于“u.id=fp.userid”的连接。你只需要检索“lp.avatar”

    我的答案是:

    SELECT 
            c.forum_id as category_id,
            c.forum_name as category_name,
            t.forum_id as id,
            t.forum_name as name,
            t.forum_desc as description,
            (SELECT COUNT(*) FROM forum_topics WHERE forum_id=t.forum_id AND topic_deleted=0) as topics_count,
            (SELECT COUNT(*) FROM forum_posts WHERE forum_id=t.forum_id AND post_deleted=0) as posts_count,
            (SELECT COUNT(*) FROM forum_posts WHERE topic_id=lp.topic_id AND post_deleted=0) as last_post_count,
            lp.topic_id as last_post_topic_id,
            lp.topic_title as last_post_topic_title,
            lp.post_time as last_post_time,
            lp.username as last_post_username,
            lp.avatar
        FROM forum_cats as t
        JOIN forum_cats as c on c.forum_id = t.forum_type_id
        left join (
            SELECT 
                ft.topic_id,
                ft.title as topic_title,
                tmp.post_time,
                u.username,
                u.avatar,
                fp.forum_id
            FROM
                forum_posts fp
                join forum_topics ft on ft.topic_id = fp.topic_id
                join users u on u.id = fp.userid
                join (
                    select forum_id, max(`post_time`) `post_time`
                    from forum_posts fp
                    where fp.post_deleted = 0
                    group by forum_id
                    ) as tmp on (fp.forum_id = tmp.forum_id and fp.post_time = tmp.post_time)
            where post_deleted = 0 and ft.topic_deleted = 0
        ) as lp on lp.forum_id = t.forum_id
        where t.forum_active = 1 and c.forum_active = 1
        order by category_id, t.forum_id
    ");
    
    推荐文章