0

これは私が実行しようとしているクエリです:

UPDATE files set refcount=
   (
      SELECT count(*) 
      FROM comments WHERE data=files.id
   ) 
   WHERE id=?;

問題は、comments.dataがテキスト列であることです (他の理由による)。したがって、 files.idを (INT) ではなく STRING としてキャストする必要があります。そうしないと、 comments.dataインデックスが使用されないためです。

たとえば、次のクエリは正常に実行されます。

SELECT count(*) FROM comments WHERE data='1234'; 

しかし、これには永遠に時間がかかります (インデックスを使用できないため、コメントには 1,000 万行あります)。

SELECT count(*) FROM comments WHERE data=1234; 

おそらく、@vars などを使用する必要がありますか? 引用符で囲んでみましたが、それは文字通りの「files.id」を使用していると思います。

UPDATE files set refcount=
   (
      SELECT count(*) 
      FROM comments WHERE data='files.id'
   ) 
   WHERE id=?;
4

1 に答える 1

0

files.id をデータと比較する前に文字列にキャストするだけです。

このようなもの :

UPDATE files set refcount=
   (
      SELECT count(*) 
      FROM comments WHERE data=CAST(files.id AS vachar)
   ) 
   WHERE id=?;

これは、 mysqlでキャスト関数と演算子を使用する方法を示すリンクです。

更新:いくつかの理由で CAST が varchar で動作していないようです.ただし、char はうまくいくかもしれませんが (下のコメントでティムが言ったようにそうではない場合)、CONCAT を使用して他の型を varchar に変換できます (他のタイプを文字列と連結すると、文字列が返され、空の文字列と連結すると、ある種の変換として機能します:))

于 2012-07-06T08:12:16.847 に答える