Преобразование MySQL выбирает к PostgreSQL

Чтобы создавать отличное программное обеспечение, вам нужны как специалисты в предметной области, так и хорошие разработчики.

14
задан Community 23 May 2017 в 12:09
поделиться

3 ответа

Вы должны указать имена столбцов в 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. "

11
ответ дан 1 December 2019 в 12:53
поделиться

У меня только что возникла эта проблема, но я перешел с 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;
8
ответ дан 1 December 2019 в 12:53
поделиться

Если вы измените свой оператор на это, он должен работать:

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 явно это делает).

2
ответ дан 1 December 2019 в 12:53
поделиться
Другие вопросы по тегам:

Похожие вопросы: