2009-08-28 3 views
1

Предположим, что я ищу, чтобы выбрать 3 столбца из нескольких объединенных таблиц: event_id, home_team и результаты агрегатной функции. Событие_id - это первичный ключ, автоинкремент. Home_team не уникален для каждой записи в таблице. Я хочу группировать event_id для генерации агрегатной функции, а затем сортировать по результатам агрегатной функции, принимающей наивысшие 3 значения. Но я также хочу, чтобы home_team был уникальным. Как я могу это сделать? Я не могу сделать DISTINCT, потому что у записи будут параметры home_team, event_id и результаты агрегатной функции. Event_id всегда будет уникальным, поэтому мой запрос DiSTINCT ничего не делает.GROUP BY и уникальность в нескольких столбцах

Мне нужно группировать event_id, поскольку функция агрегата зависит от этого, поэтому я не могу группировать home_team. Если группа I обоими это тоже не поможет, потому что ...

Пример

Table 1 
    id: 1 
    event_id: 1 
    value: 2 

    id 2 
    event_id: 1 
    value: 6 

    id 3 
    event_id: 2 
    value: 4 

    id4 
    event_id: 2 
    value: 3 

    id5 
    event_id: 3 
    value: 1 

Таблица 2

event_id (PK, autoincremented): 1 
home_team: 1 

event_id: 2 
home_team 2 

event_id: 3 
home_team: 1 

SELECT *, AVG(table1.value) as average FROM table1 JOIN table2 ON table1.event_id = table2.event_id GROUP BY table2.event_id ORDER BY average DESC 

Мне нужно сгруппировать по table2.event_id для того, чтобы генерировать правильный результат совокупной функции. Тем не менее, я также хочу HOME_TEAM быть различны, так что желаемый результат будет два результата с event_id 1 и event_id 2

+0

Я вас не понимаю. В домене одного event_id может быть несколько home_teams? Если да - как вы выбираете, что выбрать? –

+0

Я думаю, нам нужно немного больше деталей. Можете ли вы предоставить SQL или упрощенные версии вашего SQL, чтобы проиллюстрировать, что вы пытаетесь описать? –

+0

Спасибо, ребята, я поднял пример. Надеюсь, это сделает вещи более ясными ... Спасибо за помощь – 2009-08-28 18:09:51

ответ

0

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

GROUP BY event_id, home_team 

Это будет группа только те записи, которые имеют тот же event_id как а также тот же home_team.

+0

Unfortunatley, я не могу этого сделать, потому что event_id более гранулирован, чем hometeam, поэтому группировка home_team после event_id ничего не делает .... – 2009-08-28 18:10:24

1

Ну, совокупная функция, сгруппированная по уникальному ключу, не принесет вам многого, это точно. Похоже, вы заблуждаетесь в идее группировки, когда действительно все, что вам нужно, - это три лучших события с наибольшей оценкой для каждого home_team.

попробовать что-то вроде этого, вместо:

select 
    event_id, 
    home_team, 
    value 
from 
    my_tbl t 
where 
    event_id in 
     (select event_id from my_tbl 
     where home_team = t.home_team 
     order by value desc limit 0,3) 

Update: Ваша правка очищает некоторые вещи, так что здесь идет:

select 
    (select min(event_id) from table2 where home_team = t2.home_team) as event_id, 
    t2.home_team, 
    avg(t1.value) as average 
from 
    table1 t1 
    inner join table2 t2 on 
     t1.event_id = t2.event_id 
group by 
    t2.home_team 

То, что вы описываете, это довольно бессмысленно. Вы хотите удалить группу по номеру event_id, а затем показать только home_team? Если вы не хотите взять верхнюю строку home_team:

select 
    home_team, 
    max(average) as topavg 
from 
    (
    select 
     t2.event_id, 
     t2.home_team, 
     avg(t1.value) as average 
    from 
     table1 t1 
     inner join table2 t2 on 
      t1.event_id = t2.event_id 
    group by 
     t2.event_id, t2.home_team 
    ) as a 
group by 
    home_team 
Смежные вопросы