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 中并且没有拼写错误(quadra-checked this,这里濒临疯狂)。


我一生都无法弄清楚这里出了什么问题。我已经尝试过搜索 SO 并且大多数问题是由于人们使用 HAVING 而不是 WHERE,但是看到我正在使用 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您必须将其添加到GROUP BY子句中,或与例如进行比较min(total_amount)。当您按t1.id它进行分组时,您使用的 total_amount 的聚合函数无关紧要。

于 2013-03-09T14:57:07.690 回答
-1

HAVING并且GROUP BY仅适用于您实际选择的内容,与WHEREandORDER BY子句不同。所以你需要选择total_amount,恐怕。 此外,在 MySQL 中,语法是 '!=' 表示不相等。(我的立场是正确的,'<>' 在 MySQL 中很好。)

WHEREORDER BY视为您对从中选择的表的操作,并且将HAVINGGROUP BY视为对您现在拥有的数据的操作。

于 2013-03-09T14:51:40.163 回答