2011-08-10 1 views
1

基本的な問題は - WHERE CASE文でサブクエリのカウントを変数として使用しようとしていますが、使用するようには見えません。 SELECT COUNT(id)...ステートメントをWHEREエリアに置いたときに多少は機能していますが、もしそれを行うと、私はそれを3-4回別々に含める必要があります。それをSELECTに入れることができます。CASEでMySQL '変数'を使用できない

以下は、私の問題を説明する変更された例のクエリです。それは私が使用している正確なクエリではありませんが、それは私のずっと-長い/より複雑なクエリと同じエラーを与える:

エラー:

[のErr] 1054 - 不明な列「matched_sections」で " where句」

問合せ:

SELECT 
    articles.id, 
    (SELECT COUNT(id) FROM site_areas_site_sections WHERE 
     site_areas_site_sections.site_area_id = 8) AS matched_sections 
FROM 
    articles 
LEFT JOIN 
    articles_site_sections ON articles_site_sections.article_id = articles.id 
LEFT JOIN 
    site_areas_site_sections ON articles_site_sections.site_section_id = 
    site_areas_site_sections.site_section_id 
WHERE 
    (CASE 
     WHEN 
      matched_sections > 0 
     THEN 
      site_sections.id = site_areas_site_sub_sections.site_sub_section_id 
     END 
) 
+0

WHERE句の評価時に 'matched_section'カラムが存在しないこと以外は、CASE式に別の問題があるようです。これは、FROM句( 'site_areas_site_sub_sections')のどこにも見つからないテーブルを参照します。 –

+3

@Andriy M、上記のsqlは "私の問題を説明する変更されたサンプルクエリ"であり、おそらく他の必要なビットを入れたり除外したりするのを忘れていた可能性があります。 – Dirk

答えて

1
MySQLがクエリを解析するために開始したときに問題がある

は、SELECT句は最後のビットがあります分析される。それはSELECT句を見なければ、まだ持っているのでmatched_sectionsはまだ(存在しません。それに

だけで簡単に見WHERE句を通じて起こっているときに、あなたはこのような何かを試すことができます(私は誰かがすると思いますが、 )もう少しエレガントな何かを思い付くことができ:

SELECT 
    articles.id, 
    matched_sections.count 
FROM 
    articles 
LEFT JOIN 
    articles_site_sections ON articles_site_sections.article_id = articles.id 
LEFT JOIN 
    site_areas_site_sections ON articles_site_sections.site_section_id = 
    site_areas_site_sections.site_section_id, 
(SELECT COUNT(id) as count FROM site_areas_site_sections WHERE 
     site_areas_site_sections.site_area_id = 8) matched_sections 
WHERE 
    (CASE 
     WHEN 
      matched_sections.count > 0 
     THEN 
      site_sections.id = site_areas_site_sub_sections.site_sub_section_id 
     END 
) 
1

により、SQL文の要素が処理される順序、matched_sectionsWHERE句が評価された時に定義されていません

あなたは数をあらかじめ変数に渡して、それをクエリで使用します。あなたは既に言われているとおり

DECLARE matched_sections INT; 

SET matched_sections = (SELECT COUNT(id) 
          FROM site_areas_site_sections 
          WHERE site_areas_site_sections.site_area_id = 8); 
0

、エラーは、それがSELECT句の前に評価されるため、WHERE句は、あなたが実際に選択されている値について何も知らないという事実に関連しています。一般的に

、あなたはmatched_sectionsエイリアスが外側のクエリに利用可能となった場合には、派生テーブルとしてクエリ全体を使用することによって、この問題を解決することができます。

SELECT 
    id, 
    matched_section 
FROM (
    SELECT 
     articles.id, 
     (SELECT COUNT(id) FROM site_areas_site_sections WHERE 
      site_areas_site_sections.site_area_id = 8) AS matched_sections 
    FROM 
     articles 
    LEFT JOIN 
     articles_site_sections ON articles_site_sections.article_id = articles.id 
    LEFT JOIN 
     site_areas_site_sections ON articles_site_sections.site_section_id = 
     site_areas_site_sections.site_section_id 
) s 
WHERE 
    CASE 
    WHEN matched_sections > 0 
    THEN … 
    END 

あなたの元の状態は、列への参照が含まれている場合取得されないようにするには、外部クエリの条件で使用できるように、それらを派生テーブルの選択リストに追加する必要があります。

サブクエリがメインクエリに関連付けられていない場合(例ではありません)、@ Joeおよび@Dirkのソリューションは、上記の提案よりも優れたオプションです。