0

実行しようとしているSQLステートメントがありますが、エラーがスローされます。

SELECT fp.forum_id, COUNT(fp.forum_id) AS num_posts
FROM forums_posts fp
GROUP BY fp.forum_id
WHERE (
    SELECT COUNT(p.post_id) AS num_joined_posts
    FROM posts p
    WHERE p.post_type IN ('TypeA', 'TypeB', 'TypeC')
        AND p.forum_id = fp.forum_id
) > 0
ORDER BY num_posts DESC

このforums_postsテーブルは、フォーラムIDと投稿IDを照合するリレーショナルテーブルであり、postsテーブル(投稿のフォーラムIDも格納されます)には、各投稿に関する情報のみが含まれています。タイプA、タイプB、またはタイプCの投稿があるフォーラムを見つけようとしています。そして、それらの各フォーラムにはいくつの投稿がありますか。

ネストされたSQLステートメントは私の強みではありませんでした。誰かがこれを行うための正しい方法を指摘できますか?ありがとう。

4

3 に答える 3

4

where前にある必要がありgroup byます。

明示的にこれを書くこともできますjoin

SELECT fp.forum_id, COUNT(fp.forum_id) AS num_posts
FROM forums_posts fp join
     (SELECT p.forum_id, COUNT(p.post_id) AS num_joined_posts
      FROM posts p
      WHERE p.post_type IN ('TypeA', 'TypeB', 'TypeC')
      group by p.forum_id
     ) p
     on p.forum_id = fp.forum_id
GROUP BY fp.forum_id
ORDER BY num_posts DESC

ただし、最も効率的な表現は次のようになると思います。

SELECT fp.forum_id, COUNT(fp.forum_id) AS num_posts
FROM forums_posts fp join
GROUP BY fp.forum_id
having exists (select 1
               FROM posts p
               WHERE p.post_type IN ('TypeA', 'TypeB', 'TypeC') and
                     p.forum_id = pf.forum_id
               limit 1
              )
ORDER BY num_posts DESC

特に、投稿にインデックスがある場合(forum_id、post_type)。グループ化後のこの比較のデータはおそらく少ないため、条件をhaving句から句に移動します。where

于 2013-01-08T15:12:07.063 に答える
1

これを試して-

SELECT fp.forum_id, COUNT(fp.forum_id) AS num_posts
FROM forums_posts fp
WHERE (
    SELECT COUNT(p.post_id) AS num_joined_posts
    FROM posts p
    WHERE p.post_type IN ('TypeA', 'TypeB', 'TypeC')
        AND p.forum_id = fp.forum_id
) > 0
GROUP BY fp.forum_id
ORDER BY num_posts DESC
于 2013-01-08T15:13:09.857 に答える
0

これが私が行う方法です。SQLは結合を使用すると高速になる傾向があります。

SELECT * FROM 
(
  SELECT fp.forum_id,
       SUM(CASE p.post_type = 'TypeA' THEN 1 ELSE 0 END) AS A_Count,
       SUM(CASE p.post_type = 'TypeB' THEN 1 ELSE 0 END) AS B_Count,
       SUM(CASE p.post_type = 'TypeC' THEN 1 ELSE 0 END) AS C_Count
  FROM forums_posts fp
  LEFT JOIN posts p ON fp.forum_id = p.forum_id
  GROUP BY fp.forum_id
) T
WHERE T.A_count > 0 AND T.B_count > 0 AND T.C_count > 0 

私はこれをテストしていないので、タイプミスがあるかもしれません。

于 2013-01-08T15:13:38.923 に答える