2009-05-14 1 views
0

こんにちは男は罰金ですが、アクティブなレコードは、私のコードはMySqlが「サブクエリが1行以上を返します」というエラーをなぜ返すのですか?私は私のテーブル団地とすべての私の他のレコードからの私のアクティブなレコードを選択しています

@query = Estate.find_by_sql"SELECT (e.name) as estate_name, g.name as governing_body,"+ "(select count() from stands s where s.estate_id = e.id AND #{filter_estates}) as total_stands, "+ "(select e.active from estates e where e.active = true AND #{filter_estates}) as estate_status, "+ "(select count() from services sp where sp.estate_id = e.id AND #{filter_estates}) as service_providers,"+ "(select count(*) from approved_vendors av where av.estate_id = e.id AND #{filter_estates})as vendors"+ " FROM estates e LEFT JOIN governing_bodies g on e.governing_body_id = g.id AND #{filter_estates} "

であると、私はエラーを取得しています私にエラーを与えます。

アクティブで非アクティブなすべてのエステートを表示したい。

私はこの問題をどのように解決できますか。私はMySQLデータベースを使用しています。

答えて

3
あなたの三行目に問題がある可能性がありますように見えます

(select e.active from estates e where e.active = true AND #{filter_estates}) as estate_status

ライン上で、その下には、集計を使用するので、彼らは1行のみを戻す、これは(おそらく)複数の行を返すことができestate_statusに割り当てるものはわかりません。

あなたはおそらくちょうどにその行を変更できます。そのクエリが動作しない理由を私は今あなたを与えることができる最高の答えはあるので、私は確かにテーブルに精通していないです

e.active as estate_status

+0

"(select e.active from estates e where e.active = true AND #{filter_estates}) as estate_status 

変更、それを私の応答を書きながら、私は脱線ました:この作品は、以上の1行を生成します。 ;)+1 – NotMe

+0

ありがとうございます、この "(選択したe.active)as estate_status"が機能しました。良い一日を。 –

1

estate_status

として)そのラインを真= Eここe.activeと#{filter_estates}団地からe.activeを選択あなたができない複数の行を返します。他のものがaggegrate関数を使用しているので、1行しか返さないことに注意してください。入れ

ああ、私はずっと私のSQLを使用していませんが、T-SQLで私たちはしばしば、おそらく最大(e.active)またはのようなものを行う(私はSQLでリミット1だと思う)トップ1

+0

私はあなたの答えが好きです:) –

0

あなたのサブクエリ

(SELECT e.active FROM estates e WHERE ...) AS estate_status 

は一つの値以上のものを返します。曖昧でないことをちょうど1行目と1列を返さなければなりません

SELECT e.name AS estate_name , 
     g.name AS governing_body, 
     (SELECT COUNT(*) FROM stands s   WHERE ...) AS total_stands, 
     (SELECT TOP 1 e.active FROM estates e  WHERE ...) AS estate_status, 
     (SELECT COUNT(*) FROM services sp   WHERE ...) AS service_providers, 
     (SELECT COUNT(*) FROM approved_vendors av WHERE ...) AS vendors 
FROM estates e 
LEFT 
JOIN governing_bodies g ON e.governing_body_id = g.id 
          AND ... 
0

SELECT句のサブクエリ:

することができます場合には、LIKE 'TOP 1' を使用します。

"(select first(e.active) from estates e where e.active = true AND #{filter_estates}) as estate_status 
関連する問題