![]() |
|
Модераторы: skyboy |
![]()
|
|
| aktuba |
|
||||
![]() Смышленный ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1915 Регистрация: 24.4.2006 Где: Планета Земля Репутация: нет Всего: 38 |
Надеюсь админы и модеры простят за 2 вопроса в одном топике, т.к. оба вопроса относятся к одной теме...
Возникла такая проблема. Есть таблица (users), в которой находится поле last - дата и время последнего действия пользователя. Соответственно - это поле часто обновляется через UPDATE. Решил оптимизировать: создать дополнительную таблицу (tbl_last), в которую перенесу поле last:
Теперь возникла проблема с двумя запросами: 1. Обновление данных. Делаю следующим образом:
Если записи для данного пользователя нет - она добавляется. Но если есть - добавляется еще одна(!) Как пофиксить? 2. Вывод списка пользователей. Вообще не знаю с какой стороны подойти. Необходимо из таблицы users получить всех пользователей и для каждого из них получить из tbl_last время последнего действия пользователя в системе (если есть запись о текущем пользователе) или null (если записи о текущем пользователе нет). Все что пытался сделать - не помогло, теперь надеюсь на Вас... -------------------- ![]() |
||||
|
|||||
| check |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 610 Регистрация: 3.4.2006 Репутация: 3 Всего: 23 |
Не пользовался такой штукой, но подозреваю, что это сработает только если userid будет первичным ключом(ну или не первичным но уникальным).
А тут ведь ID который и является первичным ключом автоинкрементируется, поэтому ON DUPLICATE KEY не срабатывает. Добавлено через 14 минут и 21 секунду И потом, а зачем вообще что-то обновлять, если есть отдельная таблица для хранения времени последнего действия? Наибольшее время для данного UserID это и есть последнее действие этого пользователя. |
|||
|
||||
| check |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 610 Регистрация: 3.4.2006 Репутация: 3 Всего: 23 |
|
|||
|
||||
| aktuba |
|
||||
![]() Смышленный ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1915 Регистрация: 24.4.2006 Где: Планета Земля Репутация: нет Всего: 38 |
Если userid уникальный или первичный - работает только вставка нового значения, т.е. если запись для текущего пользователя есть - вообще не происходит никаких действий! =(
Потому что - здравый смысл. Представь - пользователь посмотрел 20 страниц + написал на 10 страницах по 1 комментарию, плюс посмотрел и ответил в личке. Итого за один раз на пользователя будет более 30 записей в таблице. А если страниц не 20, а 50 + по 2 комментария на каждой странице - выйдет уже более 100 записей. Зачем столько мусора? Да и база будет заполняться быстро... Вот по этим соображениям и выбран даный подход. -------------------- ![]() |
||||
|
|||||
| muzer |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 387 Регистрация: 31.8.2006 Репутация: 30 Всего: 31 |
Вы просто не совсем уловили смысл конструкции ON DUPLICATE KEY UPDATE, надо написать так: ... ON DUPLICATE KEY UPDATE last = time(); т.е. что нужно сделать, если запись с таким первичным/уникальным ключом в таблице есть, сделать именно с этой записью в таблице. Плюс, раз у вас есть отдельная таблица, то можно пользоваться вообще обычным REPLACE. Здесь ситуация такая: быстрее работать будет REPLACE, но постепенно будет портить индекс, т.е. фрагментировать его. А ON DUPLICATE KEY UPDATE индекс не портит, работает медленее. Если вы выбираете REPLACE, то нужно в какой-нибудь крон (ежедневный/еженедельный) поставить командочку OPTIMIZE TABLE table; для этой таблицы. Плюс, вижу у вас в таблице бесполезное поле ID. |
|||
|
||||
| aktuba |
|
||||||
![]() Смышленный ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1915 Регистрация: 24.4.2006 Где: Планета Земля Репутация: нет Всего: 38 |
Не работает. Проверял и до этого, но сейчас убедился еще раз...
Не самый лучший вариант - REPLACE. Как я понимаю - эта команда удалит старую запись и создаст новую. Верно?
Да, привычка. Добавлено через 3 минуты и 36 секунд УРЯ!!!! Работает! Ошибка была в названии поля... Сам виноват. P.S.: muzer, check = +1 -------------------- ![]() |
||||||
|
|||||||
![]()
|
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | MySQL | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |