SQL-запрос с группировкой работает на SQLite, а не на Postgresql - PullRequest
3 голосов
/ 15 мая 2011

Следующий запрос работает на локальном, но не на производственном уровне: (Production is heroku работает на postgreSQL, а локально я запускаю базу данных sqllite)

рубин

Tutor.joins(:expertises).where(:expertises => {:subject_id => [2,4]}).group("tutors.id").having("COUNT(*) = 2")

SQL

SELECT "tutors".* FROM "tutors" INNER JOIN "expertises" ON "expertises"."tutor_id" = "tutors"."id" WHERE ("expertises"."subject_id" IN (9)) GROUP BY tutors.id HAVING COUNT(*) = 1 ORDER BY rank DESC)

Я получаю следующую ошибку при производстве ActiveRecord :: StatementInvalid (PGError: ERROR: столбец "tutors.fname" должен появиться в предложении GROUP BY или использоваться в статистической функции

У меня в таблице есть следующие значения

id                 :integer         not null, primary key
fname              :string(255)
lname              :string(255)
school             :string(255)
major              :string(255)
year               :string(255)
bio                :text
vid                :string(255)
price              :integer
phone              :string(255)
skype              :string(255)
address            :text

Когда я пытаюсь настроить запрос на группировку по всем атрибутам, я получаю еще одну ошибку:

рубин

>> Tutor.joins(:expertises).where(:expertises => {:subject_id => [2,4]}).group("tutors.*").having("COUNT(*) = 2")

SQL

SELECT "tutors".* FROM "tutors" INNER JOIN "expertises" ON "expertises"."tutor_id" =    "tutors"."id" WHERE ("expertises"."subject_id" IN (2, 4)) GROUP BY tutors.* HAVING COUNT(*)    = 2 ORDER BY rank DESC

ActiveRecord :: StatementInvalid: PGError: ERROR: не удалось идентифицировать оператор упорядочения для репетиторов типов. УКАЗАНИЕ: используйте явный оператор упорядочения или измените запрос.

Помощь!

Ответы [ 3 ]

3 голосов
/ 15 мая 2011

PostgreSQL не поддерживает неагрегированные и разгруппированные выражения в GROUP BY запросах.

Используйте это:

SELECT  t.*
FROM    (
        SELECT  tutor_id
        FROM    expertises e
        WHERE   e.subject_id IN (2, 4)
        GROUP BY
                tutor_id
        HAVING  COUNT(*) = 2
        ) e
JOIN    tutor t
ON      t.id = e.tutor_id

Это кроссплатформенный.

3 голосов
/ 15 мая 2011

Хм, хорошая попытка, но расширение asterisk не работает таким образом в предложении GROUP BY. Вы должны на самом деле перечислить все столбцы. Или обновите до PostgreSQL 9.1 через несколько месяцев.

1 голос
/ 15 мая 2011

Попробуйте это:

subjects      = [1,2]
sub_query_sql = Tutor.select("tutors.id").joins(:expertises).
  where(:expertises => {:subject_id => subjects}).
  group("tutors.id").having("COUNT(*) = #{subjects.size}").to_sql

Tutor.joins("JOIN (#{sub_query_sql}) A ON A.id = tutors.id")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...