Чтобы создавать отличное программное обеспечение, вам нужны как специалисты в предметной области, так и хорошие разработчики.
Вы должны указать имена столбцов в SELECT, в которые вы группируете:
SELECT c.id, c.name, SUM(ABS(v.vote)) AS score
FROM categories c,items i, votes v
WHERE c.id = i.category_id
AND i.id = v.voteable_id
AND v.created_at > '#{1.week.ago}'
GROUP BY c.id, c.name
ORDER BY score DESC LIMIT 8;
«Недопустимо включать имена столбцов в предложение SELECT, которые не упоминаются в предложении GROUP BY. "
У меня только что возникла эта проблема, но я перешел с MySQL на SQL Server. Мне показалось странным тот факт, что это разрешено!
Да, в большинстве баз данных, когда у вас есть предложение GROUP BY, вы можете выбирать только агрегаты столбцов или столбцов, которые появляются в предложении GROUP BY. Это потому, что он не может узнать, действительно ли другие выбранные столбцы уникальны или нет.
Просто поместите нужные столбцы в GROUP BY, если они действительно уникальны. Это была «особенность» MySQL, вызывающая сомнения.
Вы можете прочитать о поведении MySQL и его отличиях здесь .
Пример:
SELECT c.*, SUM(ABS(v.vote)) AS score
FROM categories c,items i, votes v
WHERE c.id = i.category_id
AND i.id = v.voteable_id
AND v.created_at > '#{1.week.ago}'
GROUP BY c.id, c.name, c.whatever_else
ORDER BY score DESC LIMIT 8;
Если вы измените свой оператор на это, он должен работать:
SELECT c.id, SUM(ABS(v.vote)) AS score
FROM categories c,items i, votes v
WHERE c.id = i.category_id
AND i.id = v.voteable_id
AND v.created_at > '#{1.week.ago}'
GROUP BY c.id
ORDER BY score DESC LIMIT 8;
Я не уверен, что MySQL дает в результате, но чтобы дать вам очень небольшой пример того, почему это не работает в PostgreSQL взгляните на следующую таблицу категорий
:
id | name
---|-----
1 | ABC
1 | DEF
Вы группируете по id
, поэтому каждая строка в результате должна содержать только один id
. Если вы также выберете имя
, без группировки по нему, что должно отображаться в результате для имя
?
Это может быть ABC
или ] DEF
, но движок базы данных не может решить это за вас (хотя MySQL явно это делает).