SQLでイベント毎の参加人数を集計したいです - PHPプロ!Q&A掲示板

2509

  • 0P

SQLでイベント毎の参加人数を集計したいです

質問日時 / 2010年2月9日 17:01    回答数 / 4件

Questioner:  orpheus  このエントリーをはてなブックマークに追加 

キーワード / php    postgresql   

PHP開発ですが質問内容はSQLに特化していると思います。

SQLでイベント毎の参加人数を集計したいです。
postgreSQLを使用しています。

あるTBLを全検索しているのですが、関連テーブルとの集計結果も追加したいです。

使用するTBLは2つです。関連するカラムも記載します。
1.event(イベント)
evid(イベントid)

2.user(顧客)
uid(顧客id)
evid(イベントid)


今はこのようなSQLです。
SELECT * FROM event

このSQLに互いのevidを条件にイベント毎のカウント(参加人数)も取得するようにしたいのですが...
思ったような結果になりません。


皆さんアドバイスお願いします。

この質問への意見の募集は締め切られ、ポイントは既に配分されました。
意見を投稿することはできますが、ポイントを受け取ることはできません。



ツリー一覧

┗A01shimix>このSQLに互いのevidを条件にイベント毎のカウント(
 ┗A01-1orpheusはい、すいませんでした。 確かに丸投げでした...次
  ┗A01-1-1shimix>GROUP BY で指定されていない値を取得しようとしてい
   ┗A01-1-1-1orpheusなるほど!確かに記載のサブクエリで期待の結果が取得

回答一覧

並び替え:

A01
answerershimix [2月9日 18:17] (最終編集:2月9日 18:24)

>このSQLに互いのevidを条件にイベント毎のカウント(参加人数)も取得するようにしたいのですが...
>思ったような結果になりません。

どう書いて、どうダメだったのかくらいは提示してください。

#でないと丸投げじゃないですか・・

postgreSQLは使ったことがありませんが、普通に

  select evid, count(*) from user group by evid;

では取得できませんでしたか?


(追記)
元質問では提示されていませんが(質問した「つもり」なのかもしれませんが、エスパーじゃないので)「イベント名」などが必要なら、当然eventテーブルと結合(join)して引っ張ってくることになります。SQLの基礎だと思うので、参考書でもネット上のサイトでも探せばいくらでも転がっていると思います。

この意見に回答する

ツリーへ TOPへ

A01-1
replyerorpheus [2月10日 10:45]

はい、すいませんでした。
確かに丸投げでした...次回からもう少し聞き方に気を付けます。

ご回答頂いたSQLは上手くいきました。

下が現在の私のSQLです。
-SQL1-
SELECT * FROM event

-SQL2-
select
e.evid,count(u.uid) as cnt
from event as e
left join user as u on e.evid=u.evid
group by e.evid

このSQL2自体は参加者人数が期待通り取得できるのですが...SQL1の *部分(e.*となります) を追加するとエラーが起きます。
GROUP BY で指定されていない値を取得しようとしているので怒られてしまうようです。

私がやりたいことは上記のSQL2に、SQL1のように event を全件取得する処理も追加したいのです。
しかし今の段階ではエラーが起きているので、解決方法が思い浮かばず質問しています。 

ネットには転がっているのでしょうが、それでも理解できませんでした...

この意見に回答する

ツリーへ TOPへ

A01-1-1 満足
replyershimix [2月10日 11:49] (最終編集:2月10日 12:41)

>GROUP BY で指定されていない値を取得しようとしているので怒られてしまうようです。

group by に追加すればいいのでは?eventテーブルで必要な情報(全部必要というのであれば全部の列の名前)は既知ですから、それでいいと思いますが・・。


(別解)
どういう用途かわかりませんが、イベント数がさほど多くないのであれば

1)イベント別の参加人数を取得して(イベントIDをキーにして)配列に保存
2)イベントテーブルから全列取得・配列にIDのキーが存在したら配列の人数を使う

でもいいと思います。


(さらに別解)
多分ですが、サブクエリを使って上手く書けるんじゃないかな・・。どうでしょう。ちょっと検証環境がないので、例示するのは遠慮しておきます(汗

・・でもMySQLなら下記でいいみたいです(とりあえずは検証済み)。

  1. select eventx.*, (select count(*) from user as userx where userx.evid=eventx.evid) as count from event eventx

この意見に回答する

ツリーへ TOPへ

A01-1-1-1
replyerorpheus [2月10日 12:27]

なるほど!確かに記載のサブクエリで期待の結果が取得出来ました。

当初 group by で考えていましたので、そちらの方法も考えてみました。

select e.*,COALESCE(v.cnt,0) as uscnt from event as e LEFT JOIN (select u.evid,count(u.uid) as cnt from user as u group by evid) v ON e.evid = v.evid

こちらでも同じ結果となりました。
viewを作成することで対応しています。
参加人数はいなければ 0人 としたいので、COALESCEを使用しています。
(COALESCEは初めて知りました)


ご回答頂きありがとうございます!
おかげで解決しましたし勉強になりました。
集計 = group by というイメージでしたが、今回のケースなら使用せずとも大丈夫なのですね。


本当ありがとうございました!

この意見に回答する

ツリーへ TOPへ

<<質問一覧へ



Pick Up Q&A

Q
PHPのHTML埋め込み記述について
 このエントリーをはてなブックマークに追加 
A
$_POST["data"] == "男" ? $val = "checked" : $val = "" ; の意味は以下と同じです。 if($_POST["data"] == "男"){ $val = "checked; } e...

>>続きを読む

kende様のご指摘通り、三項演算子を使用する際には、コードの複雑度などを考慮する必要がありますね。書きやすさと共に可読性も追求したいところですね。

▲解説者:岡本(アシアル株式会社 教育コーディネーター兼 システムエンジニア)