PostgreSQLで複数の条件での絞り込み検索をしたいのです。
テーブルには
発売日、商品名、入荷日
があります。
例えば
発売日が2007年5月1日から5月5日で、商品名に「○○」もしくは「××」もしくは「△△」が含まれており、入荷日が一番新しいもの
という条件で検索したいのです。
発売日だけの絞込みならBetweenですし、商品名だけならor、入荷日の最新だったらmaxを使えば個別には検索できるのですが、これをまとめて一行でやるにはどうしたらよいのかわかりません。
それぞれでandでつなげてみましたが、orの条件がうまく反映されず、一個目の○○だけが検索に引っかかってる状態です。
××や△△もひっかかるようにするにはどう記述したらよいのでしょうか。
No.1
- 回答日時:
バージョンにもよりますが、orを使うよりinを使った方が、性能が出る場合があります。
(1)inを使う例
select *
from t1
where 発売日 between '2007-05-01' and '2007-05-05'
and 商品名 in('○○','××','△△')
order by 入荷日 desc
limit 1
(2)orを使う例
select *
from t1
where 発売日 between '2007-05-01' and '2007-05-05'
and (商品名='○○' or 商品名='××' or 商品名='△△')
order by 入荷日 desc
limit 1
ご回答ありがとうございます。
説明不足ですみません。
まず、○○を「含む」なのでlikeでなくてはならないのですが、それでもinを使うことは可能でしょうか。
次に入荷日が最新とはいえ、○○も△△も××も同じ日に入荷する可能性があります。
ゆえにlimit 1で一行だけではなく入荷日が最新であれば○○も××も結果に出したいのです。
なのでlimitではなくmaxで最新の全部という引っ張り方が必要かなと思いました。
No.2ベストアンサー
- 回答日時:
データ件数がどのくらいあるのかは分かりませんが、ユニークなキーもなく、likeの任意一致をorでつなぐという方法は、性能を出せませんよ?
select *
from t1
where 入荷日 in(
select max(入荷日)
from t1
where 発売日 between '2007-05-01' and '2007-05-05'
and (商品名 like '%○○%' or 商品名 like '%××%' or 商品名 like '%△△%')
)
and 発売日 between '2007-05-01' and '2007-05-05'
and (商品名 like '%○○%' or 商品名 like '%××%' or 商品名 like '%△△%')
No.3
- 回答日時:
こんにちは。
あまり綺麗なSQL文になりませんでしたが、ご参考までに。
【テーブル定義】
create table t_stock (
stock_nointeger not null, -- 仕入番号
item_namecharacter(100) not null, -- 商品名
item_countinteger not null default 0, -- 商品数
sale_datedate, -- 発売日
arrival_datedate, -- 入荷日
primary key(stock_no)
);
【データ】○○などは、短くして1字にして登録しています。
insert into t_stock(stock_no, item_name, item_count, sale_date, arrival_date) values(1, '○あめ', 10, '2007-04-30', '2007-05-01');
insert into t_stock(stock_no, item_name, item_count, sale_date, arrival_date) values(2, '×あめ', 10, '2007-05-01', '2007-05-01');
insert into t_stock(stock_no, item_name, item_count, sale_date, arrival_date) values(3, '△あめ', 10, '2007-05-01', '2007-05-01');
insert into t_stock(stock_no, item_name, item_count, sale_date, arrival_date) values(4, '□あめ', 10, '2007-05-04', '2007-05-05');
insert into t_stock(stock_no, item_name, item_count, sale_date, arrival_date) values(5, '×あめ', 10, '2007-05-04', '2007-05-05');
insert into t_stock(stock_no, item_name, item_count, sale_date, arrival_date) values(6, '△あめ', 10, '2007-05-05', '2007-05-05');
insert into t_stock(stock_no, item_name, item_count, sale_date, arrival_date) values(7, '○あめ', 20, '2007-05-06', '2007-05-06');
【データ取得SQL文】
SELECT t1.* FROM t_stock t1
INNER JOIN (
SELECT max(arrival_date) AS arrival_date FROM t_stock
WHERE (item_name like '%○%' OR item_name like '%×%' OR item_name like '%△%')
AND sale_date >= '2007-05-01' AND sale_date <= '2007-05-05'
) t2 ON (t1.arrival_date = t2.arrival_date)
WHERE (t1.item_name like '%○%' OR t1.item_name like '%×%' OR t1.item_name like '%△%')
ORDER BY stock_no
No.4
- 回答日時:
world99です。
chukenkenkouさんのSQL文の方が綺麗ですね。
そちらをご参考下さい。おかげさまで、私もいい勉強になりました。
ちなみに、私のサンプルにあったSQL文は以下のようになります。
SELECT t1.* FROM t_stock t1
WHERE t1.arrival_date IN(
SELECT MAX(arrival_date) FROM t_stock
WHERE (item_name like '%○%' OR item_name like '%×%' OR item_name like '%△%')
AND sale_date >= '2007-05-01' AND sale_date <= '2007-05-05'
)
AND (t1.item_name like '%○%' OR t1.item_name like '%×%' OR t1.item_name like '%△%')
AND sale_date >= '2007-05-01' AND sale_date <= '2007-05-05'
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) VBAチェックボックスで有効無効切り替えできるように 5 2022/10/21 16:13
- その他(プログラミング・Web制作) パイソンでのプログラミングについて 3 2022/08/11 20:31
- Windows 10 Windows10 ファイル名と期間でファイルを検索するにはどうすればいいか 3 2023/06/07 14:01
- Visual Basic(VBA) Sheet1の出荷日と品名が並んだ表からSheet2の品名別出荷日別の個数一覧表を作っています。 オ 3 2022/12/01 23:54
- その他(ネットショッピング・通販・ECサイト) 転売されてしまった商品を取り返そうと検索していたらフリマサイトや大手会社ではない聞いたことのないサイ 5 2022/08/25 21:22
- Excel(エクセル) エクセルでのVBA 2 2022/08/03 06:48
- Visual Basic(VBA) ファイル全てを .xlsm に変更したところ、プログラムが途中で落ちてしまっています 17 2022/12/07 12:03
- Visual Basic(VBA) EXCEL関数LOOKUPとFILTERについての質問です 1 2022/12/21 05:53
- ヤフオク! ヤフオクの検索条件について 2 2023/03/28 16:49
- Excel(エクセル) Excel 関数 vlookupなどの使い方について質問です。 シート1に品番、商品名、単価、発注条 6 2022/06/15 19:16
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
1週間後の日付を求めたい
-
pandasでsqlite3にテーブル作成...
-
SELECT INTOで一度に複数の変数...
-
【SQL】他テーブルに含まれる値...
-
Excelでしりとりを作る方法
-
Accessで最新のレコード...
-
オシロスコープYOKOGAWA DL708...
-
truncate tableを使って複数の...
-
Activation codeとは
-
エラーを起こす方法
-
次の時間帯の勝率の合計を求め...
-
Accessの構成をコピーしたい
-
sqlに記述できない文字
-
PostgreSQLのtimestamp型で時間...
-
SQLのテーブルにないデータの出力
-
1つのドメインを複数のDNSで管...
-
認知心理学で言うスクリプトとは?
-
フラグをたてるってどういうこ...
-
自作アプリからAPIで他のアプリ...
-
SQL ServerのXMLスキーマがうま...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
group byで指定したカラム以外...
-
postgreSQLのselect文でデータ...
-
PostgresSQLで自動計算
-
PostgresSQLでの動的な計算
-
ストアドプロシージャによる動...
-
1週間後の日付を求めたい
-
複数の条件での絞り込み検索の仕方
-
件数をカウントして日付でソー...
-
POSTGRESQLでt時間差が30分以上...
-
フラグをたてるってどういうこ...
-
SELECT INTOで一度に複数の変数...
-
【SQL】他テーブルに含まれる値...
-
sqlに記述できない文字
-
UPDATEで既存のレコードに文字...
-
テーブル名が可変の場合のクエ...
-
エラーを起こす方法
-
オラクルのUPDATEで複数テーブル
-
truncate tableを使って複数の...
-
結合したテーブルをSUMしたい
-
Accessで今日から5日後
おすすめ情報