Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Запись в связанные таблицы без лишних движений.

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (1): [1]   

> Описание: Необходимо внести новый тег в таблицу тегов и его ИД записать в другую таблицу.
plazmagod
Отправлено: 19 Июня, 2011 - 23:03:36
Post Id


Новичок


Покинул форум
Сообщений всего: 9
Дата рег-ции: Май 2011  


Помог: 0 раз(а)




Есть две такие таблички:

1. tag(id, caption)
2. link_asset_tag(asset_id, tag_id)

Соответственно при добавлении тега:

1. Надо проверять на уникальность поле 'caption', чтобы не создавать дубли.
2. Писать новый ИД, если он новый и старый, если старый в link_asset_tag.tag_id

Делаю:

CODE (htmlphp):
скопировать код в буфер обмена
  1.        
  2. $res_a_t = mysql_query("SELECT id FROM tag WHERE caption=$tag_caption);
  3. // Если такой тег есть:
  4. if(mysql_num_rows($res_a_t)>0)
  5.      {
  6.         $tag_id = mysql_fetch_row($res_a_t);
  7.         mysql_query("INSERT INTO link_asset_tag SET tag_id=$tag_id asset_id=$asset_id");        
  8.       }
  9. // Если такого тега нет:
  10. else
  11.    {
  12.      mysql_query("INSERT INTO tag SET tag_caption=$tag_caption");
  13.      mysql_query("INSERT INTO link_asset_tag SET tag_id='".mysql_insert_id()."' asset_id=$asset_id");
  14.     }
  15.  
  16.  


Можно ли сделать короче, красивее, проверять в самом запросе, к примеру?
 
 Top
DeepVarvar Супермодератор
Отправлено: 19 Июня, 2011 - 23:30:56
Post Id



Активный участник


Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008  
Откуда: Альфа Центавра


Помог: 353 раз(а)




plazmagod пишет:
Надо проверять на уникальность поле 'caption', чтобы не создавать дубли.

CODE (SQL):
скопировать код в буфер обмена
  1. ALTER TABLE tag ADD UNIQUE (caption);

Не даст создавать дубли - выдаст ошибку сам мускуль.

Я так понял это типа облако тегов.
Я никогда этого не делал, но сделал бы одну табличку (например теги к новостям):

id | string_tag_name | id_news

Абсолютно без проверки на уникальность имени тега.
И спокойно вставлял бы сразу несколько строк, если к новости нужно несколько тегов.
CODE (SQL):
скопировать код в буфер обмена
  1. INSERT INTO tags (id,string_tag_name,id_news)
  2.   VALUES (NULL,'новинка',56),
  3.   (NULL,'интересное',56),
  4.   (NULL,'сенсация',56)
 
 Top
EuGen Администратор
Отправлено: 19 Июня, 2011 - 23:39:22
Post Id


Профессионал


Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007  
Откуда: Berlin


Помог: 707 раз(а)






-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
plazmagod
Отправлено: 20 Июня, 2011 - 09:25:00
Post Id


Новичок


Покинул форум
Сообщений всего: 9
Дата рег-ции: Май 2011  


Помог: 0 раз(а)




DeepVarvar пишет:
Не даст создавать дубли - выдаст ошибку сам мускуль.


Тогда надо будет обработать ошибку, и дополнительным селектом выбирать существующий ИД.

DeepVarvar пишет:
Я никогда этого не делал, но сделал бы одну табличку (например теги к новостям):

id | string_tag_name | id_news

Абсолютно без проверки на уникальность имени тега.


Планируется использовать одно облако тегов на несколько таблиц. Новости, статьи в блоге, события. Плодить таблички - ни к чему.


Хотелось бы составить условную процедуру MySQL, чтоб ей дать один параметр и логика уже обрабатывалась сервером. Быстрее, чем четырьмя запросами будет.

EuGen пишет:
http://dev.mysql.com/doc/refman/...n-duplicate.html


Если честно, я не особо понял, можно ли проверить два поля одной строки на дубликат и вернуть ИД.
 
 Top
EuGen Администратор
Отправлено: 20 Июня, 2011 - 09:39:28
Post Id


Профессионал


Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007  
Откуда: Berlin


Помог: 707 раз(а)




Там же даже пример есть
Цитата:
the following two statements have identical effect:
INSERT INTO table (a,b,c) VALUES (1,2,3)
ON DUPLICATE KEY UPDATE c=c+1;

UPDATE table SET c=c+1 WHERE a=1;

Таким образом, увеличение значения поля с ключом на +1 априори обеспечит уникальность.

Кстати, возможно, речь идет о поле - первичном ключе? Тогда используйте AUTO_INCREMENT


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
plazmagod
Отправлено: 20 Июня, 2011 - 10:44:44
Post Id


Новичок


Покинул форум
Сообщений всего: 9
Дата рег-ции: Май 2011  


Помог: 0 раз(а)




1. tag(id (AUTO_INCREMENT), caption) - Здесь действительно инкремент.

При добавлении тега нужно проверить 'caption' на уникальность, тут-то запрос один. А вот добавление связи с проверкой наличия уже увеличивает количество запросов до 3.

CODE (htmlphp):
скопировать код в буфер обмена
  1.  
  2. foreach($arr_tags as $arr_tags_key => $arr_tag)
  3. {
  4. $tag_caption = $arr_tag;
  5. $asset_id = $a['id'];
  6. $res_a_t = mysqlQuery("SELECT id FROM tag WHERE caption='".$tag_caption."'");
  7. // Если такой тег существует, то просто пишем его ИД и ИД актива в таблицу link_asset_tag
  8. if(mysql_num_rows($res_a_t)>0)
  9.   {
  10.     $tag = mysql_fetch_assoc($res_a_t);
  11.     $res = mysql_num_rows(mysqlQuery("SELECT * FROM link_asset_tag WHERE tag_id=".$tag['id']." AND asset_id=".$asset_id));
  12.     if(!$res)
  13.         {
  14.         mysqlQuery("INSERT INTO link_asset_tag SET tag_id=".$tag['id'].", asset_id=$asset_id");        
  15.         }
  16.    }
  17. // Если такого тега нет:
  18. else
  19.    {
  20.      mysqlQuery("INSERT INTO tag SET caption='".$tag_caption."'");
  21.      mysqlQuery("INSERT INTO link_asset_tag SET tag_id='".mysql_insert_id()."', asset_id=$asset_id");
  22.     }
  23. }
  24.  
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« SQL и Архитектура БД »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB