わかりました...サブクエリをJOIN
句に入れる必要があります。これは、複数の列を選択し、それをSELECT
句に入れると、次のエラーが発生するため、それが許可されないためです。オペランド。とにかく、これは私の質問です:
SELECT
c.id,
c.title,
c.description,
c.icon,
p.id as topic_id,
p.title AS topic_title,
p.date,
p.username
FROM forum_cat c
LEFT JOIN (
SELECT
ft.id,
ft.cat_id,
ft.title,
fp.date,
u.username
FROM forum_topic ft
JOIN forum_post fp ON fp.topic_id = ft.id
JOIN user u ON u.user_id = fp.author_id
WHERE ft.cat_id = c.id
ORDER BY fp.date DESC
LIMIT 1
) p ON p.cat_id = c.id
WHERE c.main_cat = ?
ORDER BY c.list_no
ここで必要な重要なことは...FOR EACH
カテゴリ、各カテゴリの最新の投稿とトピックのタイトルを表示したいと思います。ただし、このselectステートメントは、main_catにある一般的なカテゴリをループするforeachループ内にあります。したがって、3〜8個のサブカテゴリを持つ5つのメインカテゴリがあります。これはサブカテゴリクエリです。しかし、各サブカテゴリについては、最新の投稿を取得する必要があります。ただし、このSELECTクエリは各メインカテゴリに対してのみ実行されるため、すべてのサブカテゴリを組み合わせた中で最新の投稿のみが選択されます...各サブカテゴリの最新の投稿を取得したい、しかし、ページの読み込みを高速にしたいので、サブカテゴリごとにこのクエリを実行するのではありません。ただし、一部のサブカテゴリにはまだトピックが含まれていない可能性があるため、最新の投稿がないサブカテゴリもあります。したがって、左結合。
これを行う方法を知っている人はいますか?
そしてところで、それが私に与えるエラーがあります(WHERE ft.cat_id = c.id)
は、サブクエリでc.id
は不明な列です。しかし、私は外部クエリからそれを参照しようとしているので、誰かがその問題についても私を助けることができますか?
ありがとうございました!
すべてのテーブル:
forum_cat (Subcategories)
-----------------------------------------------
ID, Title, Description, Icon, Main_cat, List_no
forum_topic (Topics in each subcategory)
--------------------------------------------
ID, Author_id, Cat_id, Title, Sticky, Locked
forum_post (Posts in each topic)
--------------------------------------------
ID, Topic_id, Author_id, Body, Date, Hidden'
主なカテゴリは関数にリストされています。変更されないのでスペースの無駄だったので、データベースに保存しませんでした。ただし、7つの主要なカテゴリがあります。
テーブルのDDL、関連するサンプルデータ、および目的の出力を見ずに判断するのは困難です。
私はあなたの要件を間違っているかもしれませんが、これを試してください:
SELECT *
FROM forum_cat c LEFT JOIN
(SELECT t.cat_id,
p.topic_id,
t.title,
p.id,
p.body,
MAX(p.`date`) AS `date`,
p.author_id,
u.username
FROM forum_post p INNER JOIN
forum_topic t ON t.id = p.topic_id INNER JOIN
`user` u ON u.user_id = p.author_id
GROUP BY t.cat_id) d ON d.cat_id = c.id
WHERE c.main_cat = 1
ORDER BY c.list_no