ФорумРазработкаБазы данных → INSERT без повторений

INSERT без повторений

  • technobulka

    Сообщения: 4540 Репутация: N Группа: Джедаи

    Spritz 31 августа 2010 г. 16:29, спустя 51 минуту 27 секунд

    в общем я сделал все криво, но, кажись, работает…
    	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));
    }
    }
    }


    Высокоуровневое абстрактное говно
  • Givi

    Сообщения: 2284 Репутация: N Группа: Адекваты

    Spritz 31 августа 2010 г. 18:00, спустя 1 час 30 минут 58 секунд

    Stasovsky, єєє, а с хуя у тебя:
    1. В любом случае будет replace (и просто и после инсерта тоже)? Херня получается.
    2. Какого члена у тебя запросы в цикле делают?! Незя такую какую мутить, кроме исключительных случаев.

    Ты бы лучше на словах объяснил задачу, а мы попробуем тебе выдать алгоритм обработки (который ты уже сам будешь реализовывать).
  • technobulka

    Сообщения: 4540 Репутация: N Группа: Джедаи

    Spritz 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 тега и поста…
    вот у меня и получилась такая хрень, которую вы видели выше))
    Высокоуровневое абстрактное говно
  • Givi

    Сообщения: 2284 Репутация: N Группа: Адекваты

    Spritz 31 августа 2010 г. 22:41, спустя 3 часа 14 минут 31 секунду

    Stasovsky, INSERT INTO `table (`field1`,`field2`) VALUES("тег раз","какой-то_АйДи")("тег два","какой-то_АйДи")("тег три","какой-то_АйДи");
    так вот последнюю часть и следует формировать форичем и потом выполнить один запрос. Но не пихать запросы в форич.
  • technobulka

    Сообщения: 4540 Репутация: N Группа: Джедаи

    Spritz 31 августа 2010 г. 22:43, спустя 2 минуты 39 секунд

    ага, ясно))
    Высокоуровневое абстрактное говно
  • artoodetoo

    Сообщения: 5147 Репутация: N Группа: в ухо

    Spritz 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ι унц-унц
  • technobulka

    Сообщения: 4540 Репутация: N Группа: Джедаи

    Spritz 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';

    херня получается…
    Высокоуровневое абстрактное говно
  • Hight

    Сообщения: 1489 Репутация: N Группа: Адекваты

    Spritz 13 сентября 2010 г. 19:53, спустя 11 дней 22 часа 36 минут

    Не айс такую задачку решать средствами базы. Данные перед занесением в бд всё-таки надо готовить. Хотя, всё относительно, может задачка действительно этого требует.
  • technobulka

    Сообщения: 4540 Репутация: N Группа: Джедаи

    Spritz 13 сентября 2010 г. 19:55, спустя 2 минуты 15 секунд

    Hight, предложи вариант лучше))
    Высокоуровневое абстрактное говно
  • Hight

    Сообщения: 1489 Репутация: N Группа: Адекваты

    Spritz 13 сентября 2010 г. 19:58, спустя 2 минуты 39 секунд

    Hight, предложи вариант лучше))

    Я в хмуром расположении духа сегодня. Даже тему до конца не дочитал.
  • Дмитрий

    Сообщения: 252 Репутация: N Группа: Адекваты

    Spritz 8 октября 2010 г. 21:26, спустя 25 дней 1 час 27 минут

    error = 1062 Duplicate entry


    INSERT IGNORE INTO вместо INSERT INTO если есть не вставит если нет вставит.
  • arvitaly

    Сообщения: 292 Репутация: N Группа: Адекваты

    Spritz 8 октября 2010 г. 21:50, спустя 24 минуты 32 секунды

    Кстати PREG_SPLIT_NO_EMPTY

Пожалуйста, авторизуйтесь, чтобы написать комментарий!