15

わかりました...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 つあります。

4

1 に答える 1

26

テーブルの 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
于 2013-01-29T06:13:20.963 に答える