GROUP BY句を利用したSQLで、GROUP内の件数ではなく、最終結果件数を取得するSQLの書き方を教えてください。

出来れば標準に準拠したSQLがベストですが、MySQL依存でもかまいません。

例えば

user
|user_id|user_name|
|1|hoge|
|2|fuga|

access_log
|access_log_id|access_log_user_id|access_log_datetime|
|1|1|2007-01-01 0:0:0|
|2|1|2007-01-01 0:0:0|
|3|2|2007-01-01 0:0:0|

上記のようなテーブルがある場合に、
下記のSQLを実行すると、

SELECT u.user_name, COUNT( * ) AS access_count
FROM user AS u
INNER JOIN access_log AS al ON al.access_log_user_id = u._user_id
GROUP BY au.anonymous_user_id

|user_name|access_count|
|hoge|2|
|fuga|1|

という結果が返ってきますが、

2

という最終結果件数を返すSQLが欲しいのです。

回答の条件
  • 1人2回まで
  • 登録:2007/10/25 14:19:39
  • 終了:2007/10/25 18:43:09

回答(3件)

id:TONTON3 No.1

TONTON3回答回数212ベストアンサー獲得回数42007/10/25 14:25:12

ポイント27pt

SELECT u.user_name,

の部分のu.user_name を選択しなければお望みの結果になりそうですが?

id:FnuLnu

MySQL依存のようですが、自己解決しそうです。

SELECT句にSQL_CALC_FOUND ROWSオプションを付ける事で、

COUNTがグループ化した集合にではなく結果の集合に対して働くようです。

http://private.ceek.jp/archives/002864.html

http://dev.mysql.com/doc/refman/4.1/ja/miscellaneous-functions.h...

引き続き、

標準SQLでの実現方法や、

SQL_CALC_FOUND ROWSに関する補足などあればよろしくお願いします。

---------------------------------------------------------------

質問のために例ではテーブル構造等を簡略化しているのが悪かったんですが、

実際にはaccess_logにはもう一つ外部キーが付いていたり、

メインクエリがあったりします。

質問の主旨は

「GROUP BY句を利用したSQLで、GROUP内の件数ではなく、最終結果件数を取得するSQL」

です。

2007/10/25 15:03:04
id:y-kawaz No.2

y-kawaz回答回数1420ベストアンサー獲得回数2252007/10/25 14:52:27

ポイント27pt

結果件数を取得したいなら、元々のSELECT分をサブクエリとしてカウントしてやればよいのではないでしょうか?

select count(*) from (SELECT ~) dummy;

サブクエリにはエイリアス名が必要なのでとりあえずダミーで dummy という名前を付けています。

id:FnuLnu

質問のためにテーブル構造とSQLを簡略化していますが、

実際には問題のクエリ自体がサブクエリなので、

サブクエリでの解決は避けたいです。

(可読性とパフォーマンスへの懸念からです)

が、前述のSQL_CALC_FOUND ROWSはサブクエリ内ではうまく動かなさそうな雰囲気なので、

サブクエリでやるか、アプリ側でクエリを分割するかになりそうです。

2007/10/25 15:33:32
id:dungeon-master No.3

dungeon-master回答回数571ベストアンサー獲得回数402007/10/25 17:41:58

ポイント26pt

条件に該当するuser_nameについて、ユニークな値として何種類あるかを知りたいのであれば、

distinct は使えませんか?


SELECT count( distinct u.user_name ) FROM user AS u

INNER JOIN access_log AS al ON al.access_log_user_id = u._user_id


distinctでGroup byと同様の集約をしますので、Group Byは不要です。

countで、distinctした結果の件数を得ます。

id:FnuLnu

回答ありがとうございます。

最終的にはサブクエリで実装しました。

挙げた例自体に問題があったので、

この質問はいったん閉じて、

実装に使ったSQLを例に、SQLのリファクタリング案募集という形で、

再度質問を投げてみようと思っています。

2007/10/25 18:39:42
  • id:TONTON3
    SELECT COUNT( * ) AS access_count
    (
    SELECT u.user_name FROM user AS u
    INNER JOIN access_log AS al ON al.access_log_user_id = u._user_id
    GROUP BY au.anonymous_user_id
    );

    ですかね
  • id:b-wind
    すでに何件か出ていますが、サブクエリで count するのが標準ですねぇ。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません