powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Циклы, выборки, запросы
11 сообщений из 11, страница 1 из 1
Циклы, выборки, запросы
    #38907120
yazonnile
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем привет.
В процессе работы возникла задача, для решения которой у меня не хватает знаний.
работаю с mysql (pdo) + php

таблица users_table - пару десятков тысяч строк.
user_id - уникальный ключ.
user_rate - число, о нем ниже
user_id user_name user_rate1Вася150.12Коля16.6.........

таблица events_table
(event_id, user_id) - уникальный ключ
event_rate - рейтинг каждого event
event_id user_id event_rate event_date111.51426197174121.61426197174131.31426197174210.51426197174............

Посчитать user_rate для каждого юзера. user_rate равняется сумме event_rate из выборки.
Выборка формируется из events_table
WHERE event_date>определенной_дате
LIMIT 100

Решение на php
1. Получаем список всех юзеров.
2. Пробегаем циклом через массив и для каждого юзера делаем запрос вида
Код: plsql
1.
2.
3.
4.
5.
SELECT event_rate
FROM events_table
WHERE user_id=наш_юзер_айди
AND event_date>какой-то_нашей_даты
LIMIT 100


Результат закидываем в array_sum($result)
Сумму записываем в таблицу users_table в колонку user_rate

Второй шаг можно оптимизировать, записывая не для каждого юзера, а после окончания всех вичислений записать всё сразу.
Но такой путь мне показался неправильным.
По сути, мы берем данные. Обрабатываем их. Записываем обратно.
Т.е возможно задачу можно решить совсем без php - исключительно средствами mysql, но вот здесь и возникает вакуум знаний :)

Прошу помощи у знающих ребят. Нужно знать,
1. можно ли решить поставленную задачу
2. ткните носом - что нужно для этого почитать.
...
Рейтинг: 0 / 0
Циклы, выборки, запросы
    #38907132
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Циклы, выборки, запросы
    #38907141
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
yazonnile,

эту задачу НУЖНО решать запросом или хранимой процедурой.
...
Рейтинг: 0 / 0
Циклы, выборки, запросы
    #38907150
yazonnile
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
MasterZivyazonnile,

эту задачу НУЖНО решать запросом или хранимой процедурой.
Да. Теперь уверен в этом. Но знаний не прибавилось)

К примеру я могу написать для каждого юзера нечто вроде
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
SELECT ROUND(SUM(event_rate), 4)
FROM (
	SELECT event_rate
	FROM events_table
	WHERE user_id=1
        AND event_date>1425941263
	LIMIT 100
) as event_rate



Как это запихнуть в запрос с UPDATE для каждого юзера? Цикл какой-то?
...
Рейтинг: 0 / 0
Циклы, выборки, запросы
    #38907153
yazonnile
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Пошел гуглить процедуры
...
Рейтинг: 0 / 0
Циклы, выборки, запросы
    #38907178
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
yazonnileКак это запихнуть в запрос с UPDATE для каждого юзера?Не для каждого, а для всех сразу.
Забудь слово "циклы". И в процедуры не лезь - рано тебе. Всё делается ОДНИМ несложным запросом - ссылка на документацию дана выше.
...
Рейтинг: 0 / 0
Циклы, выборки, запросы
    #38907246
yazonnile
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Akina,

я тоже знаю, что ответ в документации есть, там все сть. Но я не смог его найти. Причины выше.
Поэтому попросил помощи, и к сожалению ссылки на документации по update мало. Даже если там ответ - я его не смог найти.

AkinaВсё делается ОДНИМ несложным запросом - ссылка на документацию дана выше.
Использование цикла подсказивает логика функционального программирования. Взать список юзеров. И по каждому выполнить обработку. Вполне допускаю, что в sql такая логика не всегда верна.
Если это делается одним запросом, тем более простым - подскажите, пожалуйста.
...
Рейтинг: 0 / 0
Циклы, выборки, запросы
    #38907291
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
yazonnileИспользование цикла подсказивает логика функционального программирования. Взать список юзеров. И по каждому выполнить обработку. Вполне допускаю, что в sql такая логика не всегда верна.
Для SQL эта логика в корне неверна. Абсолютно.

yazonnileЕсли это делается одним запросом, тем более простым - подскажите, пожалуйста.

Код: sql
1.
2.
3.
4.
5.
6.
7.
UPDATE users_table, 
  ( SELECT user_id, SUM(event_rate) user_rate
    FROM events_table
    GROUP BY user_id
  ) calc
SET users_table.user_rate = calc.user_rate
WHERE users_table.user_id = calc.user_id;
...
Рейтинг: 0 / 0
Циклы, выборки, запросы
    #38907325
yazonnile
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Akina
Код: sql
1.
2.
3.
4.
5.
6.
7.
UPDATE users_table, 
  ( SELECT user_id, SUM(event_rate) user_rate
    FROM events_table
    GROUP BY user_id
  ) calc
SET users_table.user_rate = calc.user_rate
WHERE users_table.user_id = calc.user_id;


Не поверите, но я до этого даже сам дошел, и был рад, что мысль совпала с вашей. Спасибо :)

Но здесь проблема небольшая.
Там где идет выборка с группировкой не хватает условия и лимита.
Условие, к примеру, добавить не сложно.

А как добавить лимит на event_rate для каждого user_id отдельно?
...
Рейтинг: 0 / 0
Циклы, выборки, запросы
    #38907328
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
yazonnileкак добавить лимит на event_rate для каждого user_id отдельно?
FAQ: Нумерация строк и другие вопросы про использование переменных
...
Рейтинг: 0 / 0
Циклы, выборки, запросы
    #38907354
yazonnile
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо за помощь.
То, что надо.
...
Рейтинг: 0 / 0
11 сообщений из 11, страница 1 из 1
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Циклы, выборки, запросы
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]