Как включить столбец для поиска, но исключить его из GROUP BY? - PullRequest
4 голосов
/ 27 июля 2011

Я пытаюсь выполнить следующий запрос, используя Django ORM:

SELECT object_repr, content_type_id, COUNT(object_repr) 
FROM django_admin_log GROUP BY object_repr ORDER BY COUNT(object_repr);

Самое близкое, что я получил:

LogEntry.objects.values('object_repr', 'content_type__id')\
                .annotate(num_logs=Count('object_repr'))\
                .order_by('num_logs')

К сожалению, это приводит к SQL-выражению, которое возвращаетнеправильный (или, по крайней мере, неожиданный) результат:

SELECT `django_admin_log`.`object_repr`, `django_admin_log`.`content_type_id`, 
COUNT(`django_admin_log`.`object_repr`) AS `num_logs` 
FROM `django_admin_log` 
GROUP BY `django_admin_log`.`object_repr`, `django_admin_log`.`content_type_id` 
ORDER BY num_logs

Метод values ​​() включает все указанные столбцы в сегменте «GROUP BY», и я не хочу, чтобы content_type_id в моей группе GROUPОТ.Возможно ли это сделать в ORM?

edit: Оказывается, что это невозможно в ORM.Однако в интересах будущих людей найти этот вопрос, я написал запрос, который делает то, что мне нужно:

SELECT DISTINCT djl2.id, djl1.object_id, djl1.object_repr,
                         djl1.content_type_id,
                         COUNT(djl1.content_type_id) AS num_items
FROM django_admin_log AS djl1
    INNER JOIN django_admin_log AS djl2
    ON djl1.id=djl2.id
GROUP BY djl1.object_repr, djl1.content_type_id
ORDER BY num_items

По сути, внутреннее соединение.Удачи и надеюсь, что это поможет.

1 Ответ

3 голосов
/ 27 июля 2011

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

В любом случае, я обнаружил, что хотя Sqlite и MySql не будут выдавать ошибку при выполнении запроса, в котором вы выбираете столбцы, не найденные в предложении group by, эти результаты могут быть несколько сомнительными в качестве стандарта для sqlпо-видимому, не допустить этого.Я знаю, что MSSQL выдаст ошибку, когда вы попытаетесь это сделать, я не уверен насчет других разновидностей sql.

На основании этого я пришел к выводу, что django не позволяет генерировать такой запрос черезORM, потому что он технически недопустим, хотя он может работать до некоторой степени на некоторых разновидностях SQL.

Вот ссылка на мой вопрос для справки: Могу ли я контролировать GROUP BY в django1,3-х орма?

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