Создания облака тегов: добавление тегов

wbrframe

Новичок
Создания облака тегов: добавление тегов

[Задача]
Построить облако тегов по каталогу статей.

[Структура БД] Связь один к множеству
PHP:
// -----

`tags`
- tag_id   Primary Key
- tag_name UNIQUE
- tag_count DEFAULT 1

// -----

`tag_article`
- tag_id
- article_id

// -----
[Текущее решение]
Возможны случаи, что тег уже присутствует в таблице. Тогда нужно увеличивать count.
Для решения этой задачки сделал поле tag_name UNIQUE и воспользовался конструкцией ON DUPLICATE KEY UPDATE:

PHP:
/* Вставляем новые теги */
INSERT INTO tags(tag_name) VALUE('tag1'),('tag2'),('tag3')
ON DUPLICATE KEY UPDATE tag_count=tag_count+1;

/* Связиваем статью с тегами */
INSERT INTO tag_article(tag_id, article_id)
SELECT 
  tag_id, id добавляемой статьи
FROM
  tags
WHERE tag_name IN ('tag1','tag2','tag3')
[Вопрос]
Есть ли более эффективные решения с одним запросом?
 

Фанат

oncle terrible
Команда форума
одним запросом сразу записать в две разные таблицы?
 

wbrframe

Новичок
как оказалось, к сожалению mysql не поддерживает
multi insert. пожалуй только триггер поможет.
 

wbrframe

Новичок
я просто искал оптимальный вариант.
оказивается, 2 запроса это и есть он самый :)

-~{}~ 12.04.10 14:45:

Может кому-то пригодится.
Данные добавлял одной транзакцией. Но как оказалось (#bugs 27210 ) конструкция ON DUPLICATE KEY UPDATE не работает в версии 5.0.* если ENGINE=InnoDB.

Поэтому, самый оптимальный и переносимый вариант это с 3-мя запросами:
PHP:
/* Обновляем счетчик для существующих тегов */ 
UPDATE tags
SET tag_count=tag_count+1
WHERE tag_name IN ('tag1', 'tag2') 

/* Вставляем новые теги */ 
INSERT IGNORE INTO tags(tag_name)
VALUE ('tag1'),('tag2')


/* Связиваем статью с тегами */ 
INSERT INTO tag_article(tag_id, article_id) 
SELECT  
  tag_id, id добавляемой статьи 
FROM 
  tags 
WHERE tag_name IN ('tag1','tag2')
Версия mysqli: mysqlnd 5.0.5-dev
 

dimagolov

Новичок
Но как оказалось (#bugs 27210 ) конструкция ON DUPLICATE KEY UPDATE не работает в версии 5.0.* если ENGINE=InnoDB.
безумно актуально с учетом наличия веток активных релизов веток 5.1, 5.4, 5.5 и последней версии ветки 5.0.90, которая уже официально не поддерживается:
End of Product Lifecycle. Active development and support for MySQL Database Server version 5.0 has ended. However, there is still extended support available. For details, see http://www.mysql.com/about/legal/lifecycle/#calendar. According to the MySQL Lifecycle Policy (see http://www.mysql.com/about/legal/lifecycle/#policy), only Security and Severity Level 1 issues will still be fixed for MySQL 5.0. Please consider upgrading to a recent version.
 
Сверху