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 :: Проблема с ON DUPLICATE KEY
Задача создать уникальное поле `referer` при `id_url` = '" . $id_url . "', а если запись уже есть, то `count` = count + 1
Medallion
Отправлено: 21 Мая, 2012 - 07:30:33
Частый гость
Покинул форум
Сообщений всего: 253
Дата рег-ции: Май 2012 Откуда: Херсон, Украина
Помог: 7 раз(а)
Задачу можно решить, но с дополнительной выборкой и условиями. Выбираем, сравниваем, если есть запись, ничего не делаем, если записи нет, добавляем. Но, я незнаю, достойный это вариант или нет.
tuareg
Отправлено: 21 Мая, 2012 - 08:45:29
Участник
Покинул форум
Сообщений всего: 1234
Дата рег-ции: Июнь 2010
Покинул форум
Сообщений всего: 103
Дата рег-ции: Май 2012 Откуда: г.Мытищи, МО
Помог: 0 раз(а)
tuareg, Вы не внимательно прочитали мой запрос.
Задача сделать уникальное поле ТОЛЬКО при `id_url` = '" . $id_url . "'.
Другими словами, у конкретного значения `id_url` (int) не должно быть повторений полей `referer`, однако у разных `id_url`, значение `referer` может повторяться.
Я так подумал и понял что ON DUPLICATE KEY тут не подходит, и у меня есть только вариант с 3 запросами:
1) Проверяем наличие `referer` при `id_url` = '" . $id_url . "'
2) Если запись есть, то обновляем count
3) Если записи нету, то создаём её.
Т.е. как-то так, но не уверен что это оптимальное решение
Покинул форум
Сообщений всего: 1234
Дата рег-ции: Июнь 2010
Помог: 69 раз(а)
Я Вам советую( настоятельно!!!) почитать про индексы в MySQL (какие они бывают, зачем они и т.д) Ваша задача решается одним запросом. Я его Вам привел. Нужно просто сделать индексы.
Dragon_Knight
Отправлено: 21 Мая, 2012 - 18:38:30
Гость
Покинул форум
Сообщений всего: 103
Дата рег-ции: Май 2012 Откуда: г.Мытищи, МО
Помог: 0 раз(а)
tuareg, Я читал и понял что одним запросом это не сделать, иначе я-бы тут не спрашивал.
А то что Вы предоставили сделает уникальный ключ по ВСЕЙ таблице, что неприемлемо.
Покинул форум
Сообщений всего: 1234
Дата рег-ции: Июнь 2010
Помог: 69 раз(а)
Извините, если я "погорячился". Давайте по порядку.
Итак.
Зачем Вам нужно поле id? Возможно оно Вам нужно для других запросов? Если да то его оставляем, если нет, то можно удалить.
Потом я имел ввиду:
Выполните пару раз запрос.
Но эта конструкция тоже не совсем оптимальна(она работает, не оптимальна в плане размера индекса, если это не критично, тогда...). Если она Вас устроит, тогда ОК. Иначе это отдельный вопрос.
P.S Эта конструкция идеальна для простого: если нет-->вносим иначе--> увеличиваем count на 1
Dragon_Knight
Отправлено: 21 Мая, 2012 - 22:21:41
Гость
Покинул форум
Сообщений всего: 103
Дата рег-ции: Май 2012 Откуда: г.Мытищи, МО
Помог: 0 раз(а)
tuareg, да именно это и требуется. Спасибо.
Тока вопрос про табличку, можете поподробнее рассказать про "UNIQUE KEY `nashIndex` (`id_url`,`referer`(10))"
Как я понял:
nashIndex - Имя, в данном случае без разницы что указать.
(*) - Список полей, которые не должны совпадать (по логике AND).
Но вот что такое `referer`(10) - цифра 10 - ?? (Добавление)
Методом случайных проб и не менее случайных ошибок понял, что 10, это длинна сравниваемой строчки, и если строка длиннее, то сравниваются только первый 10 символов.
Все гости форума могут просматривать этот раздел. Только зарегистрированные пользователи могут создавать новые темы в этом разделе. Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.