web-dev-qa-db-ja.com

JOIN句のMYSQLサブクエリSELECT

わかりました...サブクエリを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つの主要なカテゴリがあります。

8
Peanut

テーブルの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
16
peterm