2009-08-28 12 views
1

event_id、home_team、集約関数の結果など、いくつかの結合されたテーブルから3つの列を選択しようとしています。 event_idは、オートインクリメントされた主キーです。 home_teamは、テーブルのすべてのレコードに固有のものではありません。 event_idでグループ化して集計関数を生成し、集計関数の結果をもっとも高い3つの値をソートしたいとします。しかし、私はhome_teamも一意にしたいと思っています。これどうやってするの?レコードにhome_team、event_id、および集計関数の結果があるため、DISTINCTを実行できません。私のDiSTINCTクエリは何もしないので、event_idは常に一意になります。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によってグループに必要集計関数の結果。同じEVENT_IDなどを持っている

GROUP BY event_id, home_team 

この意志グループレコードだけ:しかし、私はまた、所望の出力を2つのevent_id 1との結果とevent_idの2

+0

私はあなたを理解していません。単一のevent_idのドメイン内に複数のhome_teamsが存在する可能性がありますか?もしそうなら、どのように「選択する」を選択しますか? –

+0

もう少し詳細が必要だと思います。あなたが説明しようとしていることを説明するために、SQLやSQLの単純版を提供できますか? –

+0

ありがとう、私は例を投げた。うまくいけば物事をより明確にすることができたらうれしいです... 助けてくれてありがとうございます –

答えて

0

使用このなりますHOME_TEAMが明瞭になりたいです同じhome_teamと同じように。

+0

私はそれをすることはできません。なぜなら、event_idはhometeamよりも細かいので、event_idは何もしません。 –

1

一意のキーでグループ化された集計関数は、あなたにはあまり効果がありませんが、それは確かです。あなたが本当に望むのがそれぞれhome_teamの上位3つの最も重要なイベントであるときに、グループ化のアイデアに夢中になっているようです。

代わりに、このような何かを試してみてください:

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) 

更新:あなたの編集には、いくつかの物事をクリアし、ので、ここでは行く:あなたが記述している

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でグループ化したければ、1つだけを表示する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