Проблема с запросом MySQL, переведенным на PostgreSQL - PullRequest
3 голосов
/ 10 августа 2011

У меня есть запрос, который отлично работал на MySQL, а теперь нет на PostgreSQL. Это запрос:

  SELECT "users".* 
    FROM "users" 
    JOIN "favorites" ON "favorites"."user_id" = "users"."id"
   WHERE users.id NOT IN (2)
     AND favorites.favoritable_id IN (1)
GROUP BY favorites.user_id 
ORDER BY RANDOM() 
   LIMIT 5

Это ошибка:

column "users".id "должен присутствовать в предложении GROUP BY или использоваться в статистической функции

Я посмотрел эту ошибку, но не смог выяснить, что мне нужно сделать, чтобы это исправить.

Ответы [ 3 ]

5 голосов
/ 10 августа 2011

MySQL ужасно слаб, когда речь заходит о GROUP BY.В MySQL вы можете добавить в предложение select столбцы, которых нет в GROUP BY или в агрегатных функциях.Другие СУБД не позволяют этого, так как это не имеет смысла семантически.MySQL просто возвращает более или менее случайные значения строк, которые соответствуют данному запросу.

Из MySQL Doc

В стандартном SQL запрос, включающий предложение GROUP BY, не может ссылаться на неагрегированные столбцы в списке выбора, которые не названыв предложении GROUP BY.[...] MySQL расширяет использование GROUP BY, так что список выбора может ссылаться на неагрегированные столбцы, не указанные в предложении GROUP BY.

Что вам нужно сделать, это выяснить, что должен делать запрос, и переписать его.

4 голосов
/ 10 августа 2011

MySQL (и SQLite в этом отношении) не требуют, чтобы вы указывали каждый столбец в предложении GROUP BY, который не включен в агрегатные функции (IE: MIN, MAX, COUNT, SUM и т. Д.). Это по проекту , а также спецификация ANSI. Однако это означает, что значения для этих столбцов будут произвольными - их нельзя гарантировать каждый раз при выполнении запроса.

PostgreSQL / Oracle / SQL Server требует, чтобы вы указали каждый столбец, не заключенный в агрегатные функции в группе, или переписали запрос, чтобы он не был необходим. Использование:

  SELECT u.*
    FROM USERS u
   WHERE EXISTS (SELECT NULL
                   FROM FAVORITES f
                  WHERE f.user_id = u.id
                    AND f.favoritable_id = 1)
     AND u.id != 2
ORDER BY RANDOM()
   LIMIT 5
0 голосов
/ 14 августа 2011

Еще одна опция в PostgreSQL - это отдельное предложение on:

выбирает отличное от (col1, col2) * от пользователей;

это будет в значительной степени то, что делал mysql.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...