1

次のコードがあります。最初にデータベースから一意のスタイルを取得し、products テーブルを検索して各スタイルに関連付けられた用語を見つけ、stylerefs テーブルを styleid と productid で更新します。

$query = "Select id,style,terms from su_styles";

if ($results = $sudb->query($query)) {

while($result = $results->fetch_array(MYSQLI_ASSOC)) {

      $id=$result['id'];
      $style=$result['style'];
      $terms=$result['terms'];      

$query= "INSERT IGNORE INTO su_stylerefs (mykey,id) 
    SELECT mykey,$id FROM su_pref where (match(name) against ('$terms' in Boolean Mode)) 
    ON DUPLICATE KEY UPDATE id=$id, mykey = su_pref.mykey";     

$sudb->query($query);

最初のクエリの結果をループするのではなく、このクエリを 1 つに書き直すことはできますか? 毎日実行する必要がある他の 10 個の同様のクエリがあり、最初のクエリの一部のテーブルには数百のレコードが含まれている可能性があります。つまり、データベースへの数百の接続があり、時間がかかります。

前もって感謝します

4

1 に答える 1

0

最初にこれらすべての行をmatch()の場合と一緒にフェッチしてから、更新を行います。

INSERT INTO su_stylerefs (mykey, id)
VALUES ($mykey[0], $id[0]), ($mykey[1] $id[1]), ...
ON DUPLICATE KEY UPDATE id=$id, mykey = su_pref.mykey

2番目の解決策:

INSERT IGNORE INTO su_stylerefs (mykey,id) 
SELECT sp.mykey, ss.id
FROM su_styles AS ss
INNER JOIN su_pref AS sp
ON match(sp.name) against (ss.terms in Boolean Mode)
ON DUPLICATE KEY UPDATE id = VALUES(id), mykey = VALUES(mykey)

これはより良い解決策かもしれません。

于 2012-04-15T15:22:30.757 に答える