0

こんにちは男私は私のテーブルエステートから私のアクティブレコードを選択しています、そして他のすべてのレコードは問題ありませんが、アクティブレコードは私にエラーを与えます私のコードは

@query = Estate.find_by_sql "SELECT(e.name)as Estate_name、g.name as Governmenting_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 expected_vendors av where av.estate_id = e.id AND#{filter_estates})as vendors "+" FROM Estates e LEFT JOIN Governmenting_bodies g on e.governing_body_id = g.id AND#{filter_estates} "

エラーが発生します。

(Mysql :: Error:サブクエリは複数の行を返します:SELECT(e.name)as Estate_name、g.name as Governmenting_body、(select count()from Stands s where s.estate_id = e.id AND e.id IS NOT NULL)as total_stands、(select e.active from Estates e where e.active = true AND e.id IS NOT NULL)as Estate_status、(select count()from services sp where sp.estate_id = e.id AND e.id IS NOT NULL)as service_providers、(select count(*)from expected_vendors av where av.estate_id = e.id AND e.id IS NOT NULL)as vendors FROM Estates e LEFT JOIN Governmenting_bodies g on e.governing_body_id = g.id AND e.idはNULLではありません):

そして、アクティブと非アクティブのすべてのエステートを表示したいと思います。

みんなお願いします、どうすればこの問題を解決できますか。私はMysqlデータベースを使用しています。

4

4 に答える 4

3

3行目に問題があるようです。

(e.active = true AND#{filter_estates}であるエステートeからe.activeを選択します)as Estate_status

集計を使用する上下の行は1行のみを返すため、これは(おそらく)複数の行を返す可能性があり、estate_statusに割り当てる行がわかりません。

おそらく、その行を次のように変更することができます。

e.active as Estate_status

于 2009-05-14T14:35:51.323 に答える
1

私は確かにテーブルに精通していないので、今私があなたに与えることができる最良の答えは、そのクエリが機能しない理由です。

e.active = true AND#{filter_estates})をestate_statusとしてエステートeからe.activeを選択します

その行は複数の行を返しますが、そこでは実行できません。他の関数はaggegrate関数を使用しているため、1行しか返さないことに注意してください。

ああ、私はMy SQLをあまり使用しませんが、T-SQLでは、max(e.active)のようなことを行うか、おそらくトップ1を配置します(これは私のsQLの制限1だと思います)

于 2009-05-14T14:36:12.740 に答える
0

サブクエリ

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

複数の値を返します。

可能であれば、次のように「TOP1」を使用してください。

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 ...
于 2009-05-14T14:41:52.307 に答える
0

SELECT句のサブクエリは、明確にするために1行と1列のみを返す必要があります。このピースは複数の行を生成します:

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

に変更します

"(select first(e.active) from estates e where e.active = true AND #{filter_estates}) as estate_status
于 2009-09-11T08:01:31.073 に答える