[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Работа с данными в цикле [нужна помощь]
infant
Приветствую вас знатоки PHP. Сам в области кодинга являюсь нубом и прежде чем обратиться за помощью два дня сидел в гугле, прошу помощи в моей проблеме.
Имеем две таблицы groups и users с полями
groups
- id (id группы)
- uid (id юзера группы)
- bonus (величина бонуса)

users
- id (id юзера )
- like (количество лайков)

Количество групп закрепленных за одним юзером не ограниченно.


НЕОБХОДИМО
Получаем данные с таблицы groups
Суммируем все значения из поля bonus для каждого юзера и обновляем данные в поле like таблицы users
Например
groups 
arrow (id=>12, uid =>44, bonus =>24),
arrow (id=>13, uid =>44, bonus =>11),
arrow (id=>15, uid =>64, bonus =>23),
arrow (id=>14, uid =>44, bonus =>17),
arrow (id=>16, uid =>64, bonus =>31)
users
arrow (id=>44, like =>6),
arrow (id=>64, like =>9)


Суммируем значения поля bonus группы groups из строк 1,2,4
Добавляем результат к значению в поле like группы users по ID 44
Суммируем значения поля bonus группы groups из строк 3,5
Добавляем результат к значению в поле like группы users по ID 64

На выходе получаем
groups 
arrow (id=>12, uid =>44, bonus =>0),
arrow (id=>13, uid =>44, bonus =>0),
arrow (id=>15, uid =>64, bonus =>0),
arrow (id=>14, uid =>44, bonus =>0),
arrow (id=>16, uid =>64, bonus =>0)
users
arrow (id=>44, like =>58),
arrow (id=>64, like =>63)


С задачами сложений и простым циклом справился, а вот с разделением значений внутри цикла по ID юзера никак не могу.


Прошу не кидать в меня тапками , ботинками и прочей нужной мелочью :)

Могу выложить свой код, то чего я добился, если это кому поможет в решении моей проблемы. Заранее благодарен за любую помощь.
С Уважением Михаил.




Valick
1) нихрена не понятно, что вы хотите получить в итоге.
2) нахрена человеку ктороый по своим же словам является нубом, ставить перед собой такую задачу.

_____________
Стимулятор ~yoomoney - 41001303250491
infant
1. задачу уже решил
2. Для игры под андройд возникла необходимость сделать серверную часть

П.С. Нуб, это не значит тупой
Valick
infant, я прекрасно понимаю кто такой нуб, и ни разу не считаю вас тупым.
То что вы задачу решили это хорошо. Другое дело как вы её решили. Что-то мне подсказывает, что решение у вас на уровне РНР, а должно быть на уровне СУРБД. И если не ошибаюсь решается всего одним запросом.


_____________
Стимулятор ~yoomoney - 41001303250491
killer8080
infant
а тебе не кажется, что поле like лишнее? Или это преднамеренная денормализация?
Цитата (Valick @ 16.06.2014 - 21:57)
И если не ошибаюсь решается всего одним запросом.

обновить две таблицы одним запросом?
Valick
Цитата
обновить две таблицы одним запросом?

ну во первых на сколько я понял задачу обновить надо только одну таблицу
а во вторых
Цитата
Начиная с версии MySQL 4.0.4 вы также можете выполнять UPDATE, охватывающий множество таблиц:
UPDATE [LOW_PRIORITY] [IGNORE] tbl_name [, tbl_name ...]
    SET col_name1=expr1 [, col_name2=expr2 ...]
    [WHERE where_definition]
killer8080
Цитата (Valick @ 16.06.2014 - 23:11)
ну во первых на сколько я понял задачу обновить надо только одну таблицу

судя по
Цитата (infant @ 16.06.2014 - 13:39)
На выходе получаем
groups
arrow (id=>12, uid =>44, bonus =>0),arrow (id=>13, uid =>44, bonus =>0),
arrow (id=>15, uid =>64, bonus =>0),arrow (id=>14, uid =>44, bonus =>0),
arrow (id=>16, uid =>64, bonus =>0)users
arrow (id=>44, like =>58),arrow (id=>64, like =>63)

в таблицу юзеров пишется сумма бонусов + текущий like, а сами бонусы в таблице групп обнуляются. Т.е обновляются обе таблицы
Цитата (Valick @ 16.06.2014 - 23:11)
а во вторых
Цитата Начиная с версии MySQL 4.0.4 вы также можете выполнять UPDATE, охватывающий множество таблиц:
ну это понятно, только я не совсем представляю как это здесь можно реализовать
Valick
про обнуление я упустил из виду, ну а на счет одного запроса специально добавил "если не ошибаюсь", т.е. оставил себе пути к отступлению smile.gif
влюбом случае, даже решение двумя запросами, будет лучше решения на уровне РНР

_____________
Стимулятор ~yoomoney - 41001303250491
sergeiss
Цитата (killer8080 @ 16.06.2014 - 22:54)
обновить две таблицы одним запросом?

Правильно написанный триггер позволяет и не такие чудеса творить smile.gif

_____________
* Хэлп по PHP
* Описалово по JavaScript
* Хэлп и СУБД для PostgreSQL

* Обучаю PHP, JS, вёрстке. Интерактивно и качественно. За разумные деньги.

* "накапливаю умение телепатии" (С) и "гуглю за ваш счет" (С)

user posted image
Valick
sergeiss, триггеры это не честно ;) хочу один запрос

вот так например обновляем данные в таблице users
UPDATE users u 
JOIN (SELECT uid, SUM(bonus) bon FROM `groups` GROUP BY `uid`) g
USING(uid)
SET u.like = g.bon



_____________
Стимулятор ~yoomoney - 41001303250491
Valick
а вот так обновляем одним запросом обе таблицы
UPDATE users u 
JOIN (SELECT uid, SUM(bonus) bon FROM `groups` GROUP BY `uid`) g
USING(uid)
JOIN groups ups
SET u.like = g.bon, ups.bonus = 0

___
все теперь можно идти спать :D

_____________
Стимулятор ~yoomoney - 41001303250491
infant
вы правы, от массивов и всяких foreach можно было избавиться сразу ;)

Вот моя реализация
UPDATE users SET LIKE = (SELECT ifnull(sum(bonus),0)+ifnull(users.LIKE,0) FROM groups WHERE users.id=uid)

Дальше идет проверка выполнения запроса и если труе, ты выполняется запрос
 UPDATE `groups` SET bonus = '0'

infant
Valick, ваш вариант мне больше понравился , спасибо ребят всем, кто принимал участие в решении моей проблемы.

killer8080
Valick
хорошее решение, если исправить ошибку с using :)
UPDATE `users` `u` 
JOIN (SELECT `uid`, SUM(`bonus`) `bon` FROM `groups` GROUP BY `uid`) `g`
ON `g`.`uid` = `u`.`id`
JOIN `groups` `ups`
SET `u`.`like` = `u`.`like` + `g`.`bon`, `ups`.`bonus` = 0
Быстрый ответ:

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