2013-07-29 1 views
1

Я хочу знать, как выбрать столбцы без поместить их в группе пункт EG:Как выбрать столбцы без положить не-aggragate столбец в группе по п

select id, name, count(score) from users 
group by name 
order by count(score) desc 

Здесь я не хочу группа по идентификационной колонке

Кто-нибудь?

СОВЕТ: Django не позволяет использовать min, max, avg, top, мне нужно принудительно выбрать идентификатор без функций.

+0

Какие СУБД? Кажется, что MySQL поддерживает выбор столбцов не в 'GROUP BY'. – Yang

+0

Можете ли вы предоставить нам образцы данных и ожидаемый результат? – Parado

+0

отбросить столбец id из инструкции select ... здесь это бессмысленно. – Orangepill

ответ

0

Любая колонка, которая не имеет выполненных на ней вычислений, должна быть включена в группу GROUP BY. Почему вы хотите его в SELECT, но не в GROUP BY?

+0

Потому что у меня есть счет, который будет бесполезен, если я начну группироваться по ID – Storm

+0

В этом случае - зачем включать столбец идентификатора в результаты? –

+0

Поскольку django заставляет меня включать идентификатор в качестве первичного ключа для поиска моделей. – Storm

0

Попробуйте использовать функцию агрегата, например min, чтобы выбрать один идентификатор для группы.

select min(id) as id, name, count(score) as cnt 
from users 
group by name 
order by count(score) desc 

Вы также можете использовать функцию max.

второе решение:

select u.id, u.name, 
(select count(u1.score) from users u1 where u1.name = u.name) as cnt 
from users u 
+0

Я не могу использовать min и max и ничего, django dosent позволяет мне использовать это. – Storm

+0

Вам нужна колонка id? – Parado

+0

Да, потому что django заставляет меня использовать этот столбец для поиска моделей. – Storm

1

От MySQL documentation:

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

Это означает, что единственный способ достичь того, что вы хотите в одном запросе, - использовать инструкцию OUTER JOIN. Насколько я знаю, Django ORM не поддерживает OUTER JOIN операторов из таблицы.

Единственный способ получить то, что вы хотите (список всех моделей, в том числе идентификатор, с подсчетом количества событий для каждого уникального имени), помимо использования необработанного оператора SQL, заключается в использовании 2 отдельных запросов и обрабатывать их в Python.

Я действительно удивляюсь, если вы не хотели использовать SUM вместо COUNT. COUNT добавляет 1 для каждого значения NON-NULL, включая 0, а SUM добавляет фактические числовые значения в столбце.

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

qs = Foo.objects.values('name').annotate(count=Count('id')) # or sum=Sum('score') 
count = dict((x['name'], x['count']) for x in qs) 
object_list = Foo.objects.all() 
for foo in object_list: 
    foo.count = count['name']