У меня есть таблица вроде этого:Как обновить все строки таблицы на основе значений другой таблицы?
// requests
+----+----------------+----------------+-------------+
| id | user_id | ip | unix_time |
+----+----------------+----------------+-------------+
| 1 | 12353 | NULL | 1339412843 |
| 2 | 12353 | NULL | 1339412864 |
| 3 | NULL | 178.253.29.175 | 1339412894 |
| 4 | 3422 | NULL | 1339412899 |
| 5 | 3422 | NULL | 1339412906 |
| 6 | 3422 | NULL | 1339412906 |
| 7 | NULL | 148.23.29.109 | 1339413640 |
| 8 | NULL | 148.23.29.109 | 1339413621 |
| 9 | 5462 | NULL | 1339414490 |
| 10 | NULL | 178.253.29.175 | 1339419901 |
| 11 | 8007 | NULL | 1339424860 |
| 12 | 8007 | NULL | 1339424822 |
| 13 | 12353 | NULL | 1339424902 |
| . | . | . | . |
| . | . | . | . |
| . | . | . | . |
+----+----------------+----------------+-------------+
Также у меня есть эта таблица:
// per_days
+----+---------+--------------+----------------+-----------------+--------------+
| id | user_id | AllVisited | MaxConsecutive | LastConsecutive | request_numb |
+----+---------+--------------+----------------+-----------------+--------------+
| 1 | 12353 | 43 | 8 | 3 | 47 |
| 2 | 3422 | 530 | 130 | 32 | 100 |
| . | . | . | . | . | . |
| . | . | . | . | . | . |
| . | . | . | . | . | . |
+----+---------+--------------+----------------+-----------------+--------------+
-- each user has one row into this^table (I mean user_id column is unique)
Мне нужен запрос, чтобы выбрать все строки из requests
таблицы, которые в последний день (I «Выполняйте этот запрос каждый день по событию ), а затем обновляет все строки таблицы per_days
(для каждого пользователя отдельно). Что-то вроде этого:
UPDATE
per_days AS p
JOIN requests AS r
ON p.user_id = r.user_id
SET p.AllVisited = p.AllVisited + IF(/* there is a row */, 1, 0),
p.MaxConsecutive = IF(p.LastConsecutive > p.MaxConsecutive, LastConsecutive, MaxConsecutive),
p.LastConsecutive = IF(/* there is a row */, p.LastConsecutive + 1, 1),
p.request_numb = { /* count(1) - the number of all requests (all selected rows) for specific user in this day */ }
WHERE r.unix_time > subdate(now(), interval '1' day)
Как я могу исправить свой запрос?
Первая проблема заключается в том, что у вас есть JOIN заявление, но на самом деле не объединения двух таблиц. (Iepuser_id = r.user_id) Возможно, было бы легче начать разбивая заявление UPDATE на 4 отдельные операторы UPDATE , Затем вы можете создать соединения и условия для каждой метрики. Затем попробуйте сделать это одним UPDATE. –
@RickS Хорошая мысль, я отредактировал. – stack
Вам не нужен первый 'IF'. Если нет соответствующей строки, ничто не будет соединено. – Barmar