配列件数が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は定数で指定したいです。

回答の条件
  • 1人5回まで
  • 登録:2006/10/23 16:19:05
  • 終了:2006/10/27 10:42:01

回答(3件)

id:sera_yr No.1

sera_yr回答回数123ベストアンサー獲得回数62006/10/23 17:31:43

ポイント50pt

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 );

id:hopefully

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

すいません。

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

だめですよね??

2006/10/23 18:12:17
id:sera_yr No.2

sera_yr回答回数123ベストアンサー獲得回数62006/10/23 19:44:52

ポイント20pt

以下のようにすると、$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 );

}

id:hopefully

ありがとうございます。

2006/10/27 10:37:18
id:miyamuyuki No.3

miyamuyuki回答回数40ベストアンサー獲得回数02006/10/23 23:21:24

ポイント10pt

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

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

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


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

  delete from ワークテーブル

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

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

  ループ終了

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

ループ終了

  • id:mikkun24
    imploadってなんですか?
    インポート?ロード?
    あと、データベースはなんですか?

    配列があるということは何かのプログラムから実行するのですか?
  • id:Mook
    implode の間違いでは。
    PHP の関数です。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません