public function add_tags($tags, $post_id)
{
$tags_arr = preg_split('/\s*,\s*/',$tags);
$this->db->query("delete from ?t where ?c=?i", array("posts_tags", "post_id", $post_id));
foreach ($tags_arr as $row) {
if ($row) {
$tag_id = $this->db->query("select ?c from ?t where ?c=?", array("id", "tags", "tag_translate", $this->translate_tags($row)), "el");
if (!$tag_id) {
$tag_id = $this->db->query("insert into ?t (?c, ?c) values (?, ?)", array("tags", "tag_name", "tag_translate", $row, $this->translate_tags($row)), "id");
}
$this->db->query("replace ?t (?c, ?c) values (?i, ?i)", array("posts_tags", "post_id", "tag_id", $post_id, $tag_id));
}
}
}
Форум → Разработка → Базы данных → INSERT без повторений
INSERT без повторений
Страницы: ← Предыдущая страница →
-
31 августа 2010 г. 16:29, спустя 51 минуту 27 секунд
в общем я сделал все криво, но, кажись, работает…Высокоуровневое абстрактное говно -
31 августа 2010 г. 18:00, спустя 1 час 30 минут 58 секунд
Stasovsky, єєє, а с хуя у тебя:
1. В любом случае будет replace (и просто и после инсерта тоже)? Херня получается.
2. Какого члена у тебя запросы в цикле делают?! Незя такую какую мутить, кроме исключительных случаев.
Ты бы лучше на словах объяснил задачу, а мы попробуем тебе выдать алгоритм обработки (который ты уже сам будешь реализовывать). -
31 августа 2010 г. 19:26, спустя 1 час 26 минут 14 секунд
в цикле, потому что у меня строка тегов разбивается на массив…
я ж объяснял)) теги мне нуна сделать))
есть таблица tags(id, tag_name, tag_translate) и есть таблица связки posts_tags(post_id, tag_id) ну и табица posts, в которой id и прочее))
так вот… пришла строка тегов через запятую, разбиваю ее в массив… в tags фигачим их с переводом (tag_translate) и без повторений, в posts_tags фигачим связку по id тега и поста…
вот у меня и получилась такая хрень, которую вы видели выше))Высокоуровневое абстрактное говно -
31 августа 2010 г. 22:41, спустя 3 часа 14 минут 31 секунду
Stasovsky, INSERT INTO `table (`field1`,`field2`) VALUES("тег раз","какой-то_АйДи")("тег два","какой-то_АйДи")("тег три","какой-то_АйДи");
так вот последнюю часть и следует формировать форичем и потом выполнить один запрос. Но не пихать запросы в форич. -
-
1 сентября 2010 г. 7:45, спустя 9 часов 1 минуту 41 секунду
а если идентификатор тега используется в других таблицах, а мы захотим тег переименовать, то нам все строки в других таблицах апдейтить надо??
интересный подход :) точно так же тебе может захотеться перенумеровать айди :)
чисто гипотетически первичные ключи конечно можно переделывать, используя каскадные обновления.
ок, мне то пофигу. можно с лишним полем и индексом. можно через ON DUPLICATE. как-то долго мусолите тему:
DROP TABLE IF EXISTS `tags`;
CREATE TABLE `tags` (
`id` int(11) NOT NULL auto_increment,
`tag_name` varchar(20) NOT NULL,
`tag_translate` varchar(80) NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `tag_name` (`tag_name`)
);
INSERT INTO `tags`(`tag_name`,`tag_translate`) VALUES ('foo', 'bar') ON DUPLICATE KEY UPDATE `tag_translate`='bar';
INSERT INTO `tags`(`tag_name`,`tag_translate`) VALUES ('bla', 'blablabla') ON DUPLICATE KEY UPDATE `tag_translate`='blablabla';
INSERT INTO `tags`(`tag_name`,`tag_translate`) VALUES ('john', 'doe') ON DUPLICATE KEY UPDATE `tag_translate`='doe';
INSERT INTO `tags`(`tag_name`,`tag_translate`) VALUES ('bla', 'mazafaka') ON DUPLICATE KEY UPDATE `tag_translate`='mazafaka';
получим три строки
1 foo bar
2 bla mazafaka
3 john doe
$db->query("INSERT INTO `tags`(`tag_name`,`tag_translate`) VALUES ('$name', '$value') ON DUPLICATE KEY UPDATE `tag_translate`='$value'");ιιlllιlllι унц-унц -
1 сентября 2010 г. 21:17, спустя 13 часов 31 минуту 41 секунду
artoodetoo, а если у меня такINSERT INTO `tags`(`tag_name`,`tag_translate`) VALUES ('PHP', 'php'), ('Новости', 'novosti') ON DUPLICATE KEY UPDATE `tag_translate`='bar';
херня получается…Высокоуровневое абстрактное говно -
13 сентября 2010 г. 19:53, спустя 11 дней 22 часа 36 минут
Не айс такую задачку решать средствами базы. Данные перед занесением в бд всё-таки надо готовить. Хотя, всё относительно, может задачка действительно этого требует. -
13 сентября 2010 г. 19:55, спустя 2 минуты 15 секунд
Hight, предложи вариант лучше))Высокоуровневое абстрактное говно -
13 сентября 2010 г. 19:58, спустя 2 минуты 39 секунд
Hight, предложи вариант лучше))
Я в хмуром расположении духа сегодня. Даже тему до конца не дочитал. -
8 октября 2010 г. 21:26, спустя 25 дней 1 час 27 минут
error = 1062 Duplicate entry
INSERT IGNORE INTO вместо INSERT INTO если есть не вставит если нет вставит. -
Страницы: ← Предыдущая страница →
Пожалуйста, авторизуйтесь, чтобы написать комментарий!