Здесь курят мануал.

Добро пожаловать на Пыху!

Логин:
Пароль:
 

Нет прописки? Зарегистрируйся!

Новости

Мы в твиттере!
Мы вконтакте!
Мы на яндексе!

Краснодарское время: 26 Май, 2012, 04:15:57

Страниц: 1 2 [3]
Печать
Автор Тема: INSERT без повторений  (Прочитано 1371 раз)
0 Пользователей и 3 Гостей смотрят эту тему.
Stasovsky    ↓ 
31 Август, 2010, 04:29:30
НЕ ХУЕТА! ХУЕТА!

Сенсей XD
Группа: Джедаи

Карма: 54
Сообщений: 3654
Сила слова: 1.48

в общем я сделал все криво, но, кажись, работает...
PHP
    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    ↓ 
31 Август, 2010, 06:00:28 , спустя 1 час 30 минут 58 секунд
НЕ ХУЕТА! ХУЕТА!

Группа: Адекваты

Карма: 42
Сообщений: 2305
Сила слова: 1.82

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

Все, что говорят другие - неправда! До тех пор, пока ты сам в это не поверишь.
Если человек дурак, то... чур это не я!
Stasovsky    ↓ 
31 Август, 2010, 07:26:42 , спустя 1 час 26 минут 14 секунд
НЕ ХУЕТА! ХУЕТА!

Сенсей XD
Группа: Джедаи

Карма: 54
Сообщений: 3654
Сила слова: 1.48

в цикле, потому что у меня строка тегов разбивается на массив...
я ж объяснял)) теги мне нуна сделать))
есть таблица tags(id, tag_name, tag_translate) и есть таблица связки posts_tags(post_id, tag_id) ну и табица posts, в которой id и прочее))
так вот... пришла строка тегов через запятую, разбиваю ее в массив... в tags фигачим их с переводом (tag_translate) и без повторений, в posts_tags фигачим связку по id тега и поста...
вот у меня и получилась такая хрень, которую вы видели выше))
Записан
Givi    ↓ 
31 Август, 2010, 10:41:13 , спустя 3 часа 14 минут 31 секунду
НЕ ХУЕТА! ХУЕТА!

Группа: Адекваты

Карма: 42
Сообщений: 2305
Сила слова: 1.82

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

Все, что говорят другие - неправда! До тех пор, пока ты сам в это не поверишь.
Если человек дурак, то... чур это не я!
Stasovsky    ↓ 
31 Август, 2010, 10:43:52 , спустя 2 минуты 39 секунд
НЕ ХУЕТА! ХУЕТА!

Сенсей XD
Группа: Джедаи

Карма: 54
Сообщений: 3654
Сила слова: 1.48

ага, ясно))
Записан
artoodetoo    ↓ 
01 Сентябрь, 2010, 07:45:33 , спустя 9 часов 1 минуту 41 секунду
НЕ ХУЕТА! ХУЕТА!

с особым цинизмом
Группа: в ухо

Карма: 124
Сообщений: 3805
Сила слова: 3.26

а если идентификатор тега используется в других таблицах, а мы захотим тег переименовать, то нам все строки в других таблицах апдейтить надо??
интересный подход :) точно так же тебе может захотеться перенумеровать айди :)
чисто гипотетически первичные ключи конечно можно переделывать, используя каскадные обновления.
 
ок, мне то пофигу. можно с лишним полем и индексом. можно через ON DUPLICATE. как-то долго мусолите тему:
SQL

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';
 
получим три строки
Text

1   foo      bar
2   bla   mazafaka
3   john  doe
 

PHP

$db->query("INSERT INTO `tags`(`tag_name`,`tag_translate`) VALUES ('$name', '$value') ON DUPLICATE KEY UPDATE `tag_translate`='$value'");
 
Записан
Stasovsky    ↓ 
01 Сентябрь, 2010, 09:17:14 , спустя 13 часов 31 минуту 41 секунду
НЕ ХУЕТА! ХУЕТА!

Сенсей XD
Группа: Джедаи

Карма: 54
Сообщений: 3654
Сила слова: 1.48

artoodetoo, а если у меня так
SQL
INSERT INTO `tags`(`tag_name`,`tag_translate`) VALUES ('PHP', 'php'), ('Новости', 'novosti') ON DUPLICATE KEY UPDATE `tag_translate`='bar';
херня получается...
Записан
Hight    ↓ 
13 Сентябрь, 2010, 07:53:16 , спустя 11 дней 22 часа 36 минут 2 секунды
НЕ ХУЕТА! ХУЕТА!

Красный властелин
Группа: Адекваты

Карма: 31
Сообщений: 1626
Сила слова: 1.91

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

Stasovsky    ↓ 
13 Сентябрь, 2010, 07:55:31 , спустя 2 минуты 15 секунд
НЕ ХУЕТА! ХУЕТА!

Сенсей XD
Группа: Джедаи

Карма: 54
Сообщений: 3654
Сила слова: 1.48

Hight, предложи вариант лучше))
Записан
Hight    ↓ 
13 Сентябрь, 2010, 07:58:10 , спустя 2 минуты 39 секунд
НЕ ХУЕТА! ХУЕТА!

Красный властелин
Группа: Адекваты

Карма: 31
Сообщений: 1626
Сила слова: 1.91

Hight, предложи вариант лучше))
Я в хмуром расположении духа сегодня. Даже тему до конца не дочитал.
Записан

Дмитрий    ↓ 
08 Октябрь, 2010, 09:26:04 , спустя 25 дней 1 час 27 минут 54 секунды
НЕ ХУЕТА! ХУЕТА!

Группа: Адекваты

Карма: 6
Сообщений: 295
Сила слова: 2.03

error = 1062 Duplicate entry

INSERT IGNORE INTO вместо INSERT INTO если есть не вставит если нет вставит.
« Последнее редактирование: 08 Октябрь, 2010, 09:26:04 от Дмитрий » Записан

Надо много пережить, чтобы стать человеком. © Антуан де Сент-Экзюпери
arvitaly    ↓ 
08 Октябрь, 2010, 09:50:36 , спустя 24 минуты 32 секунды
НЕ ХУЕТА! ХУЕТА!

Группа: Адекваты

Карма: 5
Сообщений: 282
Сила слова: 1.77

Кстати PREG_SPLIT_NO_EMPTY
Записан

Страниц: 1 2 [3]
Печать
 

Перейти в:  

Этот топик скрыли: adw0rd