ニハス
phpBBのようなすべての情報を含む古典的なフォーラムインデックスを生成するためのデータを受信するためのクエリに問題があります。
私のテーブルは次のようになります。
categories:
gategory varchar(50) -> primary key
forums:
id int -> primary key
name varchar(255)
description text
category varchar(50) -> foreign key to category
topics:
id int -> primary key
forum_id int -> foreign key to forums
subject varchar(255)
posts:
id int -> primary key
topic_id int -> foreign key to topics
user_id int -> foreign key to users
post text
create_date datetime
modify_date timestramp, on_update(current_time)
users:
id int -> primary key
username varchar(32)
password varchar(32)
そして、それはとても簡単なことです。それから私はクエリを作成し始めました、そしてそれは(私の世界では)かなり速く非常に複雑になりました。取得したい:
catories:
forums:
name,
description,
count(topics)
count(posts)
last_post user_id
last_post username
last_post create_date
私は次のように動作するクエリになりました:
SELECT
f.id as fid,
f.name as name,
f.description as description,
f.category as category,
( SELECT COUNT(*)
FROM forum_topics
WHERE forum_id = f.id
) as topics,
( SELECT COUNT(*)
FROM forum_posts fp
WHERE fp.topic_id IN (
SELECT id
FROM forum_topics
WHERE forum_id = f.id
)
) as posts,
lp.user_id as lp_userid,
u.username as lp_username,
lp.create_date as lp_date
FROM forums f
LEFT OUTER JOIN (
SELECT p.create_date, p.user_id, t.forum_id
FROM forum_topics t
INNER JOIN forum_posts p ON ( t.id = p.topic_id )
ORDER BY p.create_date DESC
) lp ON (lp.forum_id = f.id)
LEFT OUTER JOIN users u ON ( u.id = lp.user_id )
GROUP BY category, f.order
大丈夫だよ; 動作しますが、パフォーマンスが非常に悪くなります。ですから、この場所にいる賢い人たちの中には、クエリを最適化する方法、いくつかのインデックスをいくつかのスマートな場所に配置する方法、またはよりスマートな方法でスキーマを再構築する方法についてアドバイスをくれる人がいるのではないかと思っていました。
// 事前にどうもありがとうございました