みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

GROUP BYについて

お世話になっております。GROUP BY に関してつまずいています。
色々と調べているのですが、解決できないため質問させて下さい。


まず下記のような履歴テーブルがあります。
rireki_member_noとは投稿者のIDであり、title1、title2に登録された日付データ(date型)は
その投稿者が投稿した日付が登録されています。(title1だけの場合もあればtitle2だけの場合もあり、両方の場合もあります)

rirekiテーブル
rireki_no rireki_member_no  title1     title2
 1       2       2014-09-12 
 2       1                 2014-09-12
 3       3       2014-09-14   2014-09-14
 4       2       2014-09-18
 5       1                 2014-09-19

また、下記は投稿者のテーブルであり、rireki_member_noと、member_noは紐付いたものとなります。
memberテーブル
memner_no  member_name
 1       佐藤
 2       吉田
 3       佐々木



そこで今回行いたいのは、タイトルを指定し、且つ日付を範囲指定した時、その会員の名前、そして投稿した日付を一覧で表示したいと考えていますが、その際のSQL文が分からず困っている状況です。

イメージ的には、

title2を指定し、2014-9-13から20149-19と範囲指定した場合


3  佐々木  2014-09-14
2  吉田   2014-09-19


といった結果を求めたいと考えています。

お恥ずかしいとは思いますが、実は昨夜からずっと悩んでいたりして・・・

rirekiテーブル単体であれば、
http://norm-nois.com/blog/archives/1293
で似たような内容で紹介されているのですが、今回のようにJOINが絡むと難易度が高くなっている状況です。

お忙しいなか恐縮ですが、お知恵を頂戴出来れば幸いです。
宜しくお願い致します。

投稿日時 - 2014-09-23 00:56:04

QNo.8764656

すぐに回答ほしいです

質問者が選んだベストアンサー

技術的な話になると微妙ですが結論からいえばサブクエリが問題になることはまずありません

じつは今回のSQLも
select
member_no ,member_name,max(title2) as max_title2
from member
inner join rireki on rireki_member_no=member_no
where title2 between '2014-09-13' AND '2014-09-19'

と書くとわずかに効率的になるのですが、本来のSQLの書き方からいうと
じゃっかんズルをしているところがあるのであまりお勧めしません。

いずれにしてもきちんとインデックスを設定しておけば、スピードに大差はないでしょう。
どうしてもカリカリにチューニングをしなくてはいけない場合に
調整項目としてはサブクエリを除外する検討が必要になってくるかもしれません

投稿日時 - 2014-09-25 09:38:04

お礼

yambejpさん、こんばんは。

お返事が遅くなり申し訳御座いません。

サブクエリの件、そうなんですね。
とてもありがたいアドバイスだと思ってます。

貴重なアドバイスをありがとうございました。

投稿日時 - 2014-09-26 22:56:50

ANo.3

このQ&Aは役に立ちましたか?

9人が「このQ&Aが役に立った」と投票しています

回答(3)

ANo.2

#1さんの回答にもあるように結果がちがいますよね?

1 佐藤  2014-09-19
3 佐々木 2014-09-14

とりあえずこんな感じ?

select
member_no ,member_name,max_title2
from member
inner join
(select rireki_member_no,max(title2) as max_title2
from rireki
where title2 between '2014-09-13' AND '2014-09-19'
group by rireki_member_no) as sub
on member_no=rireki_member_no;

投稿日時 - 2014-09-24 10:23:37

お礼

yambejpさん、こんばんは。
御親切なご回答ありがとうございます。

結果のご指摘、、仰る通りでした。

SQL文のご提示ありがとうございます!
勉強させられます。

ところで、yambejpさんから回答頂くまで、質問文中に記載しているサイトに、「サブクエリは、データ量の増加と比例し検索に時間がかかる....」といった発言が気になったため、サブクエリやGroup Byは使わず、一度全てのデータを吐き出し、その過程で(PHPで操作しているので)必要なデータのみ配列に代入させる方法を考えていました。

そこで改め質問なのですが、質問文中にあるサイトに記載のあるように、サブクエリはデータ量の増加に伴い負荷が掛ってしまうのでしょうか?

もちろんテーブルの構造等を含め色々な要素が絡むとは思いますが、一般論として、またいちご意見として伺えれば幸いです。

お忙しいなか恐縮ですが宜しくお願い致します。

投稿日時 - 2014-09-24 22:10:51

ANo.1

select member_no,member_name,title2 from member
inner join rireki on rireki_member_no=member_no
where title2 between '2014-9-13' and '2014-9-19'
です。ただし、結果は質問の結果と異なります。また、GROUP BYの質問のようですが、集計する物が無いので不要と思います。

投稿日時 - 2014-09-23 13:03:48

補足

nharasawaさん

はじめまして。ご親切な回答ありがとうございます。

Group Byは必要ないとの事ですが、テーブルrirekiのrireki_member_noカラムは
重複データがあり、重複している場合は新しい日付を抽出対象としたいと考えている事あり、
以下のサイトが一番近いと考えておりました。

引続きアドバイスのほど頂戴出来ると幸いです。

http://norm-nois.com/blog/archives/1293

投稿日時 - 2014-09-23 17:55:12

あなたにオススメの質問