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

SQL(postgreSQL)でのクエリーの記述方法の質問です。
以下のようなテーブル構成のとき、以下の条件全てに一致する商品IDを検索するにはどうように記述するのが理想でしょうか?
条件:「価格>=10000」「登録日>'2006-07-01'」「タグ='おすすめ'」「商品名='別名1'」

□master:商品マスタテーブル
・id(商品ID)
・price(価格)
・date(登録日)

□tag:タグテーブル
・tag(タグ)
・id(商品ID)

□name:商品名テーブル
・name(商品名)
・id(商品ID)

mater.id = tag.id = name.id となっています。
入力されたデータは以下のようになっています。

■masterテーブル(フィールド id/price/date)
1/10000/2006-08-01
2/15000/2006-08-02
※商品IDはユニーク。

■tagテーブル(フィールド tag/id)
おすすめ/1
定番/1
※1つの商品IDにつき複数のタグを持ちます。

■nameテーブル(フィールド name/id)
品名1/1
別名1/1
※1つの商品IDにつき複数の商品名を持ちます。

ちなみに各テーブルの各レコード数は十数万件あります。

●質問者: ktoshi
●カテゴリ:インターネット ウェブ制作
✍キーワード:2006-07-01 2006-08-01 2006-08-02 name postgreSQL
○ 状態 :終了
└ 回答数 : 2/2件

▽最新の回答へ

1 ● k6nch6n
●20ポイント

select m.id from master m, tag t, name n

where m.id = n.id

and m.id = t.id

and m.price >= 10000

and m.date >= '2006-07-01'

and t.tag = 'おすすめ'

and n.name = '別名1'

where句で参照されているカラムにはindexを作成しておいた方がいいと思います。

◎質問者からの返答

ありがとうございます。

シンプルな記述ですね。記述がシンプルな方が、処理もシンプルに速く動くと思ってよいのでしょうか。


質問に追加:

サブクエリーの使い方が分からないので、正しく記述できてるか分かりませんが以下のような方法ってどうなのでしょうか。

select m.id from master m where m.price >= 10000 and m.date >= '2006-07-01 and m.id in (select t.id from tag t where t.tag = 'おすすめ' and t.id in (select n.id from name n where n.name = '別名1')


2 ● kurukuru-neko
●50ポイント ベストアンサー

>処理もシンプルに速く動くと思ってよいのでしょうか。

いいえ

データ件数が多い場合、SQLを実行して

実際のQUERY PLANの検証が必要です。

結合の順序をかえたり、条件のしていのしかたにDBの

癖があるので実際にためしてみる必要があります。

Subqueryの方法でもよいと思いますが、

(x) and (y) and (z)

(z) and (y) and (x)

等結合の順序や、"()"の指定によっても処理

結果がかわる事があります。

実際に確認して動作速度を調べることをお勧めします。

今回だと商品名='別名1'が制約条件として

一番厳しい(一致件数が少ない)ように思えるが

実際はわからない。


確認方法は、

EXPLAN 確認したいSQL文

http://osb.sra.co.jp/PostgreSQL/Manual/PostgreSQL-7.4-ja/sql...

http://itpro.nikkeibp.co.jp/members/ITPro/oss/20041203/15344...

https://www.thinkit.co.jp/free/marugoto/2/1/16/1.html

http://www2b.biglobe.ne.jp/~caco/fourth_edition/tuning.html

◎質問者からの返答

ありがとうございます。

データベースシステムの種類やバージョン、データベースの組み方やデータの量などはそれぞれなので、実際に試行錯誤しながらそのデータベースにあった最適なものを探すしかないのですね。

URLも参考になりました。

関連質問


●質問をもっと探す●



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