2011-02-14 4 views
0

t1.id = t2.idなどを使用してテーブルのフィールドを別のテーブルのカウントから更新する方法は知っていますが、 WHERE節でLIKE STATEMENTを使用する必要があります。LIKEステートメントを使用している間に別のテーブルのカウントに基づいてテーブルを更新する方法

これは私がやりたかったものです。

UPDATE `CATEGORIES` 
SET `num_listings` = (SELECT COUNT(*) 
         FROM `LISTINGS` 
         WHERE `LISTINGS`.`CATEGORY` LIKE 
           ws_concat('', "%-", `CATEGORIES`.`ID`, "-%")); 

(例:私は、フィールド名CATEGORYとしてリスティングテーブル内-25-として格納されCATEGORYを持っている)

私は私がここにws_contactを使用できないことを理解し、それを達成するための別の方法は何ですか?

ありがとうございます。

+0

あなたのデータベース構造を正規化して、コメントを追加した場合、クエリのこの種のはおそらく容易になるだろう'listings_categories'の新しいアソシエーションテーブル –

+0

まあ、何千ものエントリを持つ既存のウェブサイトのバグの修正やアップデートに取り組んでいるので、これは現在できません。 –

答えて

0

カテゴリIDがリスティングテーブル内の文字列の一部だけで表現される理由がない限り、このようなデータ構造を処理する最も良い方法は、です.LISTINGSテーブルにcategory_idカラムを追加しますを入力し、リストを追加または編集するときは、この列に正しく入力されていることを確認してください。

これにより、単純にJOINの2つのテーブルON categories.id = listings.category_idが可能になり、はるかに意味があります。これにより、パフォーマンスがさらに向上します。

あなたはとDBの構造を維持したいならば、あなたがLIKEとCONCATで、一時テーブルを使用することができます。

DROP TABLE IF EXISTS temp; 

CREATE TABLE temp AS 
     SELECT categories.id, COUNT(*) AS c 
     FROM categories 
     JOIN listings ON listings.category LIKE CONCAT('%',categories.id,'%') 
     GROUP BY categories.id; 

UPDATE categories, temp 
SET categories.num_listings = temp.c 
WHERE categories.id = temp.id; 
+0

ありがとう、何百万人ものGalz!これはまさに私が探していたものです。あなたは揺れる! –

関連する問題