[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Обновление данных статистики
maximka787
Парни привет. Подскажите, что не так в запросе. Есть 2 таблицы: Товары и их посещаемость (статистика).
1) product: `id`,`name`,`stat`
1 | Носки | 0
2 | Перчатки | 0
//Нули на конце это сумарные просмотры (посещаемость)

2) stat: `id`,`product`
1 | 1
2 | 1
3 | 1
4 | 2
//то есть товар №1 посетили 3 раза, а товар номер 2 - 1 раз.

Мне нужно, чтобы обновить таблицу product суммарными данными из второй таблицы.
Вот я экспериментировал, но пока безуспешно.
UPDATE `product` SET `product`.`stat` = `product`.`stat` + (
SELECT COUNT(`stat`.`product`)
FROM `stat`
GROUP BY `stat`.`product`
WHERE `stat`.`product` = `product`.`id`
)
WHERE `stat`.`product` = `product`.`id`


_____________
..Работает - не трогай!
Valick
maximka787, тут надо использовать JOIN


_____________
Стимулятор ~yoomoney - 41001303250491
depp
что мешает избавиться от второй таблицы? не вижу в ней смысла при такой структуре.
AllesKlar
maximka787
у тебя ошибка в запросе
UPDATE `product`
WHERE `stat`.`product`
Основной запрос ничего не знает об таблице stat
А вот подзапрос в курсе об существовании таблицы из остновного запроса.
В общем-то, тебе нужно просто выкинуть лишнее
UPDATE `product` SET `product`.`stat` = `product`.`stat` + (
SELECT COUNT(`stat`.`product`)
FROM `stat`
GROUP BY `stat`.`product`
WHERE `stat`.`product` = `product`.`id`
)


_____________
[продано копирайтерам]
Valick
Цитата
не вижу в ней смысла при такой структуре

depp, это что-то типа буферной таблицы, хотя логика работы её не описана, но судя по тому что результат прибавляется к существующему значению, то после этого действия таблица очищается. Цель такой таблицы снижение нагрузки при большом количестве посетителей, когда некогда делать UPDATE, а идут сплошные INSERT в буферную таблицу, причем в этой таблице не должно быть индексов.


_____________
Стимулятор ~yoomoney - 41001303250491
maximka787
Спасибо большое AllesKlar за запрос, сейчас проверю.

Да, Valick прав, именно для этих целей и создается буферная таблица. Она же вторым запросом очищается. Раньше поле stat работало по принципу UPDATE + 1. Но если сейчас это особо не играет роли, то при увеличении таблиц и посетителей, думаю актуально. Главное, чтоб механизм уже был готов к такому.

А на счет индекса, тут я напортачил видать. У меня вторая таблица:
id, product, data
//поле id индекс, автоинкеремент, зачем-то))
тогда оставлю таблицу без этого поля. толку от него, еще и индекс)

_____________
..Работает - не трогай!
Valick
Цитата
Она же вторым запросом очищается.

я же написал про JOIN, хотел что бы вы сами пораскинули мозгами
ну нет так нет
http://phpforum.su/index.php?showtopic=82155&hl=update
smile.gif

_____________
Стимулятор ~yoomoney - 41001303250491
maximka787
Цитата (Valick @ 9.12.2014 - 08:18)
Цитата
Она же вторым запросом очищается.

я же написал про JOIN хоте что бы вы сами пораскинули мозгами
ну нет так нет
http://phpforum.su/index.php?showtopic=82155&hl=update
smile.gif

Я пораскинул. д так, что это всё делает PHP, за 3 этапа. Не лучший вариант) А JOIN в данном вопросе, даже не представляю что-то...

_____________
..Работает - не трогай!
maximka787
Valick
Благодарю за подсказку. JOIN сработал.

AllesKlar
Твой запрос пишет ошибку, долго ковырял, понял, что без JOINа тут правда нельзя.

Мой рабочий запрос.

UPDATE `product`
LEFT JOIN `stat`
ON `stat`.`id_product` = `product`.`id`
SET `product`.`stat` = `product`.`stat` + (SELECT COUNT(`stat`.`id_product`) FROM `stat` WHERE `stat`.`id_product` = `product`.`id`)


Всем спасибо за поддержку.

_____________
..Работает - не трогай!
Valick
по ссылке запрос с GROUP BY
сделайте так же и сравните скорость обоих вариантов
правда таблицу надо побольше

_____________
Стимулятор ~yoomoney - 41001303250491
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.