人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

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

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

●質問者: dosukoi1988
●カテゴリ:コンピュータ ウェブ制作
✍キーワード:00 2007-02-01 2007-02-16 2007年 2月15日
○ 状態 :終了
└ 回答数 : 4/4件

▽最新の回答へ

1 ● b-wind
●23ポイント

色々ダメな気がする。

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;

こんなところ?

◎質問者からの返答

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

#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


2 ● chuken_kenkou
●23ポイント

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関数は不要です。

◎質問者からの返答

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

テスト機は3.23.58

実機は4.0でした。


3 ● snaruseyahoo
●22ポイント

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


4 ● Yota
●22ポイント

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に外部キー制約をつけないと、整合性が取れなくなる可能性があります。

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ