0

結合されたテーブルの要素の合計を「メイン」テーブルのフィールドの値と比較する必要があるクエリに取り組んでいます。私のクエリの要点は次のとおりです。

SELECT t1.id
FROM table1 AS t1
INNER JOIN table2 t2 ON t2.t1_id = t1.id -- AND OTHER CONDITIONS
-- WHERE more t1 conditions
GROUP BY t1.id
HAVING SUM(t2.amount) <> t1.total_amount
AND SUM(t2.amount) = (t1.component1+t1.component2+t1.component3+t1.component4);

出力: ERROR 1054 (42S22): Unknown column 't1.total_amount' in 'having clause' 言うまでもなく、フィールドは t1 に存在し、タイプミスはありませんでした (クアドラでこれを確認しましたが、ここでは狂気の瀬戸際です)。


私は一生、ここで何が悪いのか理解できません。私はすでにSOを検索しようとしましたが、問題のほとんどはWHEREの代わりにHAVINGを使用しているためですが、SUM()を使用しているので、これが正しい方法だと思います.


編集:Terjeの答えは最も正確でしたが、(おそらくこれまでで最も愚かな更新文)私の更新文でその構文を使用せずにそれをうまくやってのけることができました。それ以外の場合は失敗します):

UPDATE t1
SET t1.total_amount = 
(
  SELECT SUM(t2.amount) 
  FROM table 2
  --WHERE, AND 
  GROUP BY t1.id
  HAVING SUM(t2.amount) <> t1.total_amount
  AND SUM(t2.amount) = (t1.component1+t1.component2+t1.component3+t1.component4)
)
WHERE t1.id IN (same awful subquery as before, except selecting t2.t1_id)
--AND other conditions
;

PS : ここでの最終目標は、更新文で同じ有条件を使用することです事前に感謝の気持ちを込めて -Lauri

4

2 に答える 2

2

と比較するには、それを句t1.total_amountに追加するか、たとえば と比較する必要があります。グループ化しているため、使用している total_mount の集計関数は関係ありません。GROUP BYmin(total_amount)t1.id

于 2013-03-09T14:57:07.690 に答える
-1

HAVINGand句とGROUP BYは異なり、実際に選択しているものに対してのみ機能します。恐れ入りますが、 を選択する必要があります。 WHEREORDER BYtotal_amountまた、MySQL での不等号の構文は '!=' です。(私は訂正します。'<>' は MySQL では問題ありません。)

WHEREandORDER BYは、選択しているテーブルの操作であり、and は現在のデータの操作であるHAVINGGROUP BY考えてください。

于 2013-03-09T14:51:40.163 に答える