数が莫大になっても短時間で検索できるようにしまっといてくれるのがDBのいいところ でも高々1万とかならリニアで十分 100万とかあると探索アルゴリズムが威力が効いてくる 0585デフォルトの名無しさん2018/04/17(火) 21:08:16.86ID:IUYvc0m6 小規模だと遅くなるだろうな。 0586デフォルトの名無しさん2018/04/17(火) 21:19:21.97ID:O41FhP2w 小規模だとどちらも体感0秒だから変わらない 0587デフォルトの名無しさん2018/04/18(水) 02:06:34.84ID:yJ81KmRv>>586 DB使って、どういうキーでクエリー出すの? 俺は詳しくないから考え方だけでいいので教えて ・x>=キーのものの中からMINを取って、それのyを出力? ・x>=キー and 次のレコードのx<キー?(次のレコードって見れるのかは知らんけど) ・x,yの他にx2として範囲の最後をデータとして追加しておき、x<=キー and x2<キー? 何かベストマッチな方法がありそうだけどね (上記の方法ではとてもDBの検索が効率よくいけるとは思えんので) 0588デフォルトの名無しさん2018/04/18(水) 03:06:20.17ID:kaO6I25j 単純にSELECT y FROM hoge WHERE x BETWEEN a AND bで 実態はSQL側で最適化してくれるよ データを扱うことに特化した高級言語な訳だし
個人的にはDB使うかどうかって、 データの流動性(?)がポイントな気がする 弄る機会が多ければ多いほど恩恵受けられる訳だから 0589デフォルトの名無しさん2018/04/18(水) 03:22:30.21ID:yJ81KmRv>>588 BETWEEN a AND bって、aからbの間ってことじゃなかったっけ? x=100502の場合のyを求めるのにどう書くの? BETWEEN 100502 AND 100502でいいんだっけ? 0590デフォルトの名無しさん2018/04/18(水) 03:27:30.58ID:yJ81KmRv これって例えば、10000から11000の間にあるデータxを全部抽出したい場合とかに使うものなのでは? 0591デフォルトの名無しさん2018/04/18(水) 03:58:19.16ID:yJ81KmRv>>587の例って全部おかしかったので書き直しとく ・MAX(x<=100502) ・x<=100502 and (次のレコードのx)?>100502 ・x<=100502 and x2>=100502 0592デフォルトの名無しさん2018/04/18(水) 11:34:48.13ID:gg2GabAw 表は x の最大と最小(xmin,xmax)と y をただ入れといて select y from xytbl where x between xmin and xmax みたいにすればいいじゃん。 xmin + 1 が次の xmax と一致するので無駄があるが xmin, xmax にインデックス作っておけば多分速くはなるだろう。 どうしても無駄をなくしたい場合は xmin と y だけにして xmax はビュー作ってそちらであるかのように見せかけておくか、または複雑になるが一つのSQL文にするかだ。 0593デフォルトの名無しさん2018/04/19(木) 02:32:23.49ID:h5gs+kbl>>592 何を言ってるのか不明 表にxminとyしかないのなら、xは使えないだろ また、[x,y,xmin,xmax]= ([100000,1000,100000,100500], [100501,1001,100501,100700], [100701,1002,100701,120000],…) ってことで select y from xytbl where x between xmin and xmax なら全レコードがマッチするよ 0594デフォルトの名無しさん2018/04/19(木) 03:01:26.91ID:h5gs+kbl between句は、 SELECT カラム名 , ... FROM テーブル名 WHERE カラム BETWEEN 値1 AND 値2; で SELECT カラム名 , ... FROM テーブル名 WHERE カラム >= 値1 AND カラム <= 値2; と書くのと同等の機能
select y from tbl01 where x between 100000 and 110000 なら select y from tbl01 where x >= 100000 and x<=110000 と同じってこと 0595デフォルトの名無しさん2018/04/19(木) 10:18:42.11ID:XRkJ53+o>>593 うまく伝わらなかったかな?考えてることは多分同じだよ。 例えば以下のようにするの(以下はSQLiteでのSQL)。
create table xytbl (xmin, xmax, y); insert into xytbl (xmin, xmax, y) values (100000, 100500, 1000), (100501, 100700, 1001), (100701, 120000, 1002); create table xtbl (x); insert into xtbl (x) values (9999), (100300), (100502), (118000), (120100); select x, y from xytbl, xtbl where x between xmin and xmax;
ここでは xtbl に x の値だけ並べて入れておいて後でまとめて selectして x, y 両方出している。 0596デフォルトの名無しさん2018/04/19(木) 10:19:56.20ID:T9/zIgZR ごめんびとうぃーん言い出しっぺだけどダメだね 感覚と言うかノリだけで書いてしまった 実際書くと即だめじゃんってなるやつ 0597デフォルトの名無しさん2018/04/19(木) 10:22:29.59ID:XRkJ53+o PerlからDBI経由でDBアクセスするならxtbl不要でxの部分はprepareで'?'にしておいてexecuteで実際の値を渡せば良い。 0598デフォルトの名無しさん2018/04/19(木) 10:28:26.42ID:T9/zIgZR 真面目に今考えた結果 Select y From hoge Where ? < x Order by x Desc Limit 1; で多分取れる 0599デフォルトの名無しさん2018/04/23(月) 17:03:26.38ID:YcjqEwjB $$で取得するプロセスIDはどんな環境でも最大4桁までですか? 0600デフォルトの名無しさん2018/04/23(月) 17:19:28.43ID:AJxfAl3T>>599 んなこたなかろう。Linuxで ps -fe とかやれば5桁ぐらいのが沢山出てくるぞ。 かといって最大5桁で作って安心してはいけない。 将来的に変わるかも知れないしLinux以外ではもっと桁数あるかも知れないからな。 0601デフォルトの名無しさん2018/05/01(火) 17:33:53.54ID:Jzi33zXB 全く初歩的な質問ですいません ググってみたのですがそのものズバリの例を見つけることができませんでした。 やりたいことは、連装配列に配列を入れて取り出すことです。 最後の出力行が [2] となることを意図していますが、出力は [] となり、ワーニングもでています。 配列を入れたつもりの連装配列の要素が配列とは認識されていないようです。 この場合どのように書けば、所期の結果が得られるでしょうか?
$ perl -v
This is perl 5, version 18, subversion 2 (v5.18.2) built for x86_64-linux-gnu-thread-multi (with 46 registered patches, see perl -V for more detail) 〜後半略〜
$ perl -w sample.pl [2] Use of uninitialized value in printf at sample.pl line 9. [] 0602デフォルトの名無しさん2018/05/01(火) 17:45:53.43ID:4WtZiQYp $hash01{"name"}=\@array01;