Как я могу обновить таблицу на основе подсчета другой таблицы при использовании оператора LIKE

0 Arvind K. [2011-02-14 15:54:00]

Я знаю, как обновить одно поле таблицы из другого подсчета таблицы, используя t1.id = t2.id и т.д., но у меня есть типичная проблема. Я должен использовать предложение LIKE STATEMENT в WHERE.

Это то, что я хотел сделать.

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

(Пример: у меня есть CATEGORY, сохраненная как -25- в таблице LISTINGS в качестве имени поля CATEGORY)

Я понимаю, что я не могу использовать ws_contact здесь, но есть ли другой способ его достижения?

Спасибо заранее.

mysql subquery


1 ответ


0 Galz [2011-02-14 16:09:00]

Если нет веской причины для того, чтобы идентификатор категории был представлен только частью строки в таблице списков, наилучшим способом обработки такой структуры данных является добавить столбец category_id в LISTINGS table и убедитесь, что при добавлении или редактировании списка этот столбец заполнен правильно.

Это позволило бы просто JOIN двум таблицам ON categories.id = listings.category_id и иметь гораздо больше смысла. Это также обеспечит лучшую производительность.

Если вы хотите сохранить структуру БД как есть, вы можете использовать временную таблицу с 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;