ここから本文です

サブクエリにGROUP BY句を加えるとエラーになります。 うまいやり方はないでしょ...

sut********さん

2014/5/103:05:31

サブクエリにGROUP BY句を加えるとエラーになります。
うまいやり方はないでしょうか?

下記のクエリを実行するとエラーになります。
ちなみに「GROUP BY watch.ip」を除くとクエリは正常に実行されます。
------------------------------------------
SELECT
history.*,

(SELECT
COUNT(historyId)
FROM
watch
WHERE
history.id = watch.historyId
) AS count,

(SELECT
COUNT(historyId)
FROM
watch
WHERE
history.id = watch.historyId AND
watch.time + 60*60*24*7 > UNIX_TIMESTAMP()
GROUP BY watch.ip
) AS recentCount

FROM
history

ORDER BY recentCount DESC
------------------------------------------
テーブル「watch」のカラム「ip」の値が重複するレコードを除くには、
クエリをどのように変更すればよいでしょうか?

閲覧数:
594
回答数:
3
お礼:
250枚

違反報告

ベストアンサーに選ばれた回答

agu********さん

2014/5/113:03:08

group by を付加するということは、その(group by に指定した)列ごとのcount(historyId)が結果として返ります。つまり結果セットが複数行になるわけですが、selectで同じ列を指定していないので単に数値だけの複数行になります。

(例)
COUNT(historyId)
-------------------
6
3
9
15
2

のような結果セットです(普通はwatch.ipもselectします。でないと意味がないので)。

本当にそれが「このサブクエリで取得したい」内容ですか?どう考えても「複数行の結果が返る」ことが妥当には思えません。AS recentCount として取得するようになっているので単一行でないとマズイですよね。

すでに指摘があるようにwhere条件で絞るべきケースではないのか、再考してください。

#何をしたいのかが読み取れないので、適切なSQL文の
#提示ができず申し訳ないですが(汗)。

この回答は投票によってベストアンサーに選ばれました!

ベストアンサー以外の回答

1〜2件/2件中

並び替え:回答日時の
新しい順
|古い順

kon********さん

編集あり2014/5/210:35:48

select 文の
直接述語部
(select X where ~ group by ~ order by ~
のXの部分)
にselect文を関数的に入れることが
できるのは、select結果が単一行である
ことが確実な場合だけであることが普通
だと思います。

group byが入ると、結果は一般的に複数行に
なるのでエラーになる可能性が高いと
思います。(recentCountは一般的に
複数行からなる)

したがって関数的にselect count(...)
を述語部に使うことはできないと
考えたほうが良さげです。

最初のselect文( as count)
は例外ですべてのwatch行(whereで抽出された
行)が単一グループにあるものとして
count(historyId)が集計されるので単一行性
が保証できるのでエラーにならなかったので
はないかと思います。
追記
もしhisotryにip項目があった場合など
たとえばrecentCountにおいて
having history.ip=watch.ip
などの追加指定を入れて単一行に
なるようにした場合などはもしかすると
エラーにならないかもしれません
(ただしクエリーの目的に合致している
のかどうかについてはまったく無視して
いますが...)

プロフィール画像

カテゴリマスター

nob********さん

2014/5/109:18:19

どのような結果を望んでいるのか分からないので回答しにくいです。ip別の意味で有れば「GROUP BY watch.ip」を「and watch.ip=history.ip」とすれば可能と思います。

みんなで作る知恵袋 悩みや疑問、なんでも気軽にきいちゃおう!

Q&Aをキーワードで検索:

Yahoo! JAPANは、回答に記載された内容の信ぴょう性、正確性を保証しておりません。
お客様自身の責任と判断で、ご利用ください。
本文はここまでです このページの先頭へ

「追加する」ボタンを押してください。

閉じる

※知恵コレクションに追加された質問は選択されたID/ニックネームのMy知恵袋で確認できます。

不適切な投稿でないことを報告しました。

閉じる