2016-06-27 11 views
0

У меня есть таблица вроде этого:Как обновить все строки таблицы на основе значений другой таблицы?

// 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) 

Как я могу исправить свой запрос?

+0

Первая проблема заключается в том, что у вас есть JOIN заявление, но на самом деле не объединения двух таблиц. (Iepuser_id = r.user_id) Возможно, было бы легче начать разбивая заявление UPDATE на 4 отдельные операторы UPDATE , Затем вы можете создать соединения и условия для каждой метрики. Затем попробуйте сделать это одним UPDATE. –

+0

@RickS Хорошая мысль, я отредактировал. – stack

+0

Вам не нужен первый 'IF'. Если нет соответствующей строки, ничто не будет соединено. – Barmar

ответ

2

Соединитесь с подзапросом, который возвращает все идентификаторы пользователей в requests в диапазоне времени. Используйте LEFT JOIN, а затем ваш if there's a row тест станет r.user_id IS NOT NULL.

UPDATE 
    per_days AS p 
LEFT JOIN (
    SELECT DISTINCT user_id 
    FROM requests 
    WHERE unix_time > subdate(now(), interval '1' day)) AS r 
ON p.user_id = r.user_id 
SET p.AllVisited  = p.AllVisited + IF(r.user_id IS NOT NULL, 1, 0), 
    p.MaxConsecutive = IF(p.LastConsecutive > p.MaxConsecutive, LastConsecutive, MaxConsecutive),  
    p.LastConsecutive = IF(r.user_id IS NOT NULL, p.LastConsecutive + 1, 1) 
+0

Спасибо .. upvote. Вы знаете, что такое «AllVisited»? Это будет '++' в день, если у пользователя есть активность в этот день. Поэтому я думаю, что это 'p.AllVisited + IFNULL (r.count, 0)' должно быть 'p.AllVisited + IF (r.count, 1, 0),'. Я прав? – stack

+0

Ваш исходный код соединялся с каждой строкой и не группировался, поэтому я думал, что вы хотите добавить 1 для каждой строки, которая была сопоставлена. – Barmar

+0

И мой последний вопрос: на самом деле мне не нужен столбец 'request_numb', и я могу его игнорировать * (потому что кажется, что ему нужно еще одно соединение для подсчета строк) *. Так что, пожалуйста, добавьте свой запрос, не работая над столбцом 'request_numb'? Предположим, что 'request_numb' вообще нет. – stack

Смежные вопросы