MySQL4系でのSQL文について教えて下さい。


books テーブル
---------------------------+--------------+
| Field | Type | Null | Key |
+---------------------------+-------------
| id | int(10) | | PRI |
| store_id | int(10) | |
| name | text | YES | | NULL |(本の名前)
| date | datetime(0000-00-00 00:00:00 |(発売日)
+---------------------------+-------------

stores テーブル
---------------------------+-------------
| Field | Type | Null | Key |
+---------------------------+-------------
| id | int(10) | | PRI | |
| name | text | YES | | NULL |(出版社名)
| boss | text | YES | | NULL |(社長)
+---------------------------+-------------

上記テーブル構成において、『2007年2月1日から2007年2月15日に発売された本を出版社毎に集計』して、

<<発売本数、出版社名、社長名>>

と出力したいです。SQL文を教えて下さい。

select count(*),stores.name,stores.boss
from stores,books
where books.date > 2007-02-01 AND 2007-02-16 > books.date
Groupby books.store_id
having count(*) > 0

でいけると思ったのですが、日付の絞りこみがうまくいかないみたいです。。

回答の条件
  • 1人2回まで
  • 登録:2007/03/04 00:06:33
  • 終了:2007/03/11 02:40:03

回答(4件)

id:b-wind No.1

b-wind回答回数3344ベストアンサー獲得回数4402007/03/04 00:18:19

ポイント23pt

色々ダメな気がする。

SELECT count(*),stores.name,stores.boss
  FROM stores JOIN books ON stores.id = books.store_id
  WHERE books.date BETWEEN '2007-02-01' AND '2007-02-15'
  GROUP BY books.store_id
  ORDER BY books.store_id;

こんなところ?

id:dosukoi1988

ご回答ありがとうございます。早速ためしてみたところ、エラーがでてしまいました。

#1064 - You have an error in your SQL syntax near 'ON stores.id = books.store_id

WHERE books.date BETWEEN '2007-02-01' AND '2' at line 1

2007/03/04 01:09:48
id:chuken_kenkou No.2

chuken_kenkou回答回数722ベストアンサー獲得回数542007/03/04 02:53:10

ポイント23pt

MySQL4系とのことですが、4.0と4.1では大幅な機能拡張がされています。どちらなのか、明記した方がいいと思います。

select count(*),stores.name,stores.boss
 from stores,books
 where store_id=stores.id
   and date(date) between '2007-02-01' and '2007-02-16'
 group by store_id;

質問中にあったSQL、及び上記のSQL例では、group byに関して、MySQLの独自機能を使用しています。MySQL AB :: MySQL 4.1 リファレンスマニュアル :: 6.3.7.3 非表示のフィールドに対する GROUP BY

日付にdatetimeを使用していますが、時刻を入れることがあるのでしょうか?もし時刻が入るなら、上記SQLのように、date関数を使用する必要があります。時刻を入れないなら、「00:00:00」が仮定され、date関数は不要です。

id:dosukoi1988

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

テスト機は3.23.58

実機は4.0でした。

2007/03/04 03:26:58
id:snaruseyahoo No.3

snaruseyahoo回答回数491ベストアンサー獲得回数42007/03/04 16:42:20

ポイント22pt

「books.date > 2007-02-01 AND 2007-02-16 > books.date」の>を=> <を=<にしてテストしてみてください。(=蛾抜けていると思います)

id:Yota No.4

Yota回答回数453ベストアンサー獲得回数282007/03/05 12:15:23

ポイント22pt

SELECT COUNT(*),stores.name,stores.boss

FROM stores,books

WHERE stores.id = books.store_id

AND books.date BETWEEN '2007-2-1' AND '2007-2-16'

GROUP BY stores.name,stores.boss

HAVING COUNT(*) > 0 ;

前の人のを読むとJOINが使えないのかなと思うので。

もし使えたら、

SELECT COUNT(*),stores.name,stores.boss

FROM stores

INNER JOIN books

ON stores.id = books.store_id

WHERE books.date BETWEEN '2007-2-1' AND '2007-2-16'

GROUP BY stores.name,stores.boss

HAVING COUNT(*) > 0 ;

余談ですが、books.store_idに外部キー制約をつけないと、整合性が取れなくなる可能性があります。

コメントはまだありません

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

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

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

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