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

配列件数が7500件くらいあります。
それを2000件ずつの配列に分けて
imploadをし、SQLを実行したいのですが
どのようにしたらいいのでしょうか?

配列の中身:
Array
(
[3036] => 3036


[1636212] => 1636212
[1636295] => 1636295
[1636910] => 1636910
[1636961] => 1636961
[1637547] => 1637547
[1637588] => 1637588
[1636678] => 1636678
)

実行したいSQL
select test_id from aaaa where test_id
IN (ここに2000個のID);

以上、どうしたらいいでしょうか??

2000は定数で指定したいです。

●質問者: hopefully
●カテゴリ:就職・転職 コンピュータ
✍キーワード:SELECT SQL 配列
○ 状態 :終了
└ 回答数 : 3/3件

▽最新の回答へ

1 ● sera_yr
●50ポイント

PHPであることが前提ですが、array_sliceで配列を必要な分だけ取り出してはいかがでしょうか。

配列の最大長が動的に変化するのであれば、以下の処理は関数化したほうがよいと思います。

それにしても重たいSQLを実行するんですね。。他に方法はないのでしょうか。。

//$aryには、7500くらいの値が設定されているものとします。

define( 'ARY_CNT', 2000 );

//配列要素0?2000の値でSQLを実行

$in_str = impload( ",", array_slice( $ary, 0, ARY_CNT ) );

select test_id from aaaa where test_id IN ($in_str );

//配列要素2000?4000の値でSQLを実行

$in_str = impload( ",", array_slice( $ary, ARY_CNT*1,ARY_CNT ) );

select test_id from aaaa where test_id IN ($in_str );

//配列要素4000?6000の値でSQLを実行

$in_str = impload( ",", array_slice( $ary, ARY_CNT*2, ARY_CNT ) );

select test_id from aaaa where test_id IN ($in_str );

//配列要素6000?7500?の値でSQLを実行

$in_str = impload( ",", array_slice( $ary, ARY_CNT*3, ARY_CNT ) );

select test_id from aaaa where test_id IN ($in_str );

◎質問者からの返答

7500の数は動的に変化します。

すいません。

これは、9000とかになったら継ぎ足さないと

だめですよね??


2 ● sera_yr
●20ポイント

以下のようにすると、$aryの数が変化しても対応できます。

define( 'ARY_CNT', 2000 );

$array_date_cnt = count( $ary );

$ary_slice_cnt = (int)ceil( $array_date_cnt / ARY_CNT );

for( $i = 0; $i < $ary_slice_cnt; $i ++ ) {

$slice_st = $i * ARY_CNT

$in_str = impload( ",", array_slice( $ary, $slice_st, ARY_CNT ) );

select test_id from aaaa where test_id IN ($in_str );

}

◎質問者からの返答

ありがとうございます。


3 ● miyamuyuki
●10ポイント

in に 2000個ものリストを書くのは良くないです。(つか RDBMS によっては数に制限があります。

言語がわからないので概念的に

まず、test_id の項目だけを持ったワークテーブルを作ります。


ループ開始(2000件ずつ処理、配列の要素がなくなるまで)

delete from ワークテーブル

ループ開始(2000個の配列要素がなくなるまで)

2000個の配列要素をワークテーブルに insert

ループ終了

select test_id from aaaa where test_id IN (select test_id from ワークテーブル);

ループ終了

関連質問


●質問をもっと探す●



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