合并两个不同的MySQL表,对它进行排序和限制以获得组合结果

时间:2010-12-20 15:45:02

标签: php mysql

我需要将各种MySQL表组合起来以获得通用结果。所需和预期的结果是网站上最后X条评论的列表,但这些表格是个人,例如:news_comments,pages_comments等。单独地,这些表格具有JOINS到用户数据库。

此评论表中的3个结构为:

news_comments, pages_comments, other_comments
id int ai
id_new/id_page/id_other int
id_user int
comment text
created int (timestamp)

用户表:

id int ai
login int
password varchar
...

我最后没有完成,因为我们只需要id和登录。

此查询(个人)的正常使用是:

SELECT users.id, users.login, news_comments.*, news_comments.id AS id_comment
FROM users, news_comments
WHERE users.id=news_comments.id_user AND news_comments.id_new=$id
ORDER BY created DESC
LIMIT $offset,$rows

工作正常!

但是在后端我希望列出网站上的所有评论来调节和控制它。我需要组合所有注释表,按创建的desc命令并限制结果以进行分页。

我使用MySQL和PHP,所以如果我需要使用PHP,那就没问题了。

我怎么做?

提前致谢!

1 个答案:

答案 0 :(得分:2)

SELECT  *
FROM    (
        SELECT  *
        FROM    (
                SELECT  *
                FROM    news_comments
                WHERE   id_new = $id
                ORDER BY
                        created DESC
                LIMIT $rows
                ) q
        UNION ALL
        SELECT  *
        FROM    (
                SELECT  *
                FROM    pages_comments
                WHERE   id_new = $id
                ORDER BY
                        created DESC
                LIMIT $rows
                ) q
        UNION ALL
        SELECT  *
        FROM    (
                SELECT  *
                FROM    other_comments
                WHERE   id_new = $id
                ORDER BY
                        created DESC
                LIMIT $rows
                ) q
        ) q
JOIN    users u
ON      u.id = q.id_user
ORDER BY
        created DESC
LIMIT   $offset, $rows

请注意,限制也应用于每个内部查询,以便它们可以从索引中受益。

创建以下索引:

CREATE INDEX ix_newscomments_new_created ON news_comments (id_new, created)
CREATE INDEX ix_pagescomments_new_created ON pages_comments (id_new, created)
CREATE INDEX ix_othercomments_new_created ON other_comments (id_new, created)

让它快速工作