2013-03-09 3 views
0

Я работаю над запросом, который использует необходимость сравнивать сумму элементов из объединенной таблицы с значением поля из «основной» таблицы. Вот суть моего запроса:MySQL с SUM (column1) <> column2 не работает

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): Неизвестный столбец «t1.total_amount» в «имеет пункт» Излишне говорить, что поле не существует в t1 и вообще не было опечатки (квадра проверила это, на грани безумия здесь).


Я не могу для жизни меня выяснить, что здесь не так. Я пробовал искать SO уже, и большинство проблем возникают из-за людей, использующих HAVING вместо WHERE, но, видя, что я использую SUM(), я думаю, что это правильный путь.


EDIT: ответ Терье был наиболее точным, хотя мне удалось вытащить его без использования этого синтаксиса (возможно, самого глупого обновления предложения всех времен) моего обновление предложение, которое было (глупо, делать не пытайтесь это дома, если все остальное не сработает):

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

ответ

2

Для того, чтобы сравнить с t1.total_amount, вам необходимо добавить его в пункт GROUP BY или сравнить его, например, min(total_amount). Поскольку вы группируетесь по t1.id, не имеет значения, какую совокупную функцию total_amount вы используете.

+0

Хм, эта идея может быть лучше для моего конечного решения. Спасибо, Терье! Когда я получу его для работы в обновлении, ваш ответ будет выбран. –

-1

HAVING и GROUP BY работает только на вещи, которые вы на самом деле выбирающих, в отличие от WHERE и ORDER BY статей. Боюсь, вам нужно выбрать total_amount. Кроме того, синтаксис равен '! =' Для неравных в MySQL. (я исправлюсь, «<>» хорошо в MySQL.)

Придумай WHERE и ORDER BY как вашу манипуляцию таблиц вы выбирающие из и HAVING и GROUP BY как манипулирования данной теперь есть.

+0

Хорошо, выбор поля, похоже, сделал трюк, за исключением того, что теперь я получаю пустой набор, где мне нужно получать результаты. Это может быть на моем конце, хотя я вернусь к вам по этому поводу. Спасибо за идею, Svip. Слово примечания, хотя, <> работает просто отлично;). –

+0

Ох. Тогда я удалю эту записку из ответа. – Svip

+0

Да, пустые наборы были из-за моей собственной глупости. Я не знаю, почему кто-то мог бы ответить на ваш ответ, поскольку вы были первыми и в основном по делу. –

 Смежные вопросы

  • Нет связанных вопросов^_^