2010-12-20 8 views
1

共通の結果を得るために、さまざまなMySQLテーブルを組み合わせる必要があります。必要な結果と期待される結果は、Webサイト上の最後のXコメントのリストですが、テーブルはnews_comments、pages_commentsなどのような個人です。個別に、このテーブルにはユーザーデータベースへのJOINSがあります。2つのさまざまなMySQLテーブルをマージし、結合した結果を注文して制限する

このコメントテーブルの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を使用する必要がある場合は問題ありません。

どうすればいいですか?

ありがとうございます!

答えて

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) 

は、内側のクエリに制限を適用するについて、高速

+0

+1素敵なコメントを仕事に。 – davek

関連する問題