Ich habe eine Tabelle wie folgt aus:Wie kann ich alle Zeilen einer Tabelle basierend auf den Werten einer anderen Tabelle aktualisieren?
// 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 |
| . | . | . | . |
| . | . | . | . |
| . | . | . | . |
+----+----------------+----------------+-------------+
Auch habe ich diese Tabelle:
// 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)
Ich brauche eine Abfrage alle Zeilen aus requests
Tabelle auszuwählen, die in den letzten Tag (I Diese Abfrage wird jeden Tag von einem Ereignis ausgeführt und aktualisiert dann alle Zeilen der per_days
Tabelle (für jeden Benutzer separat). Etwas wie dieses:
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)
Wie kann ich meine Frage reparieren?
Das erste Problem ist, dass Sie eine JOIN-Anweisung haben, aber nicht tatsächlich die Verbindung der beiden Tabellen zusammen. (Iepuser_id = r.user_id) Vielleicht wäre es einfacher, durch das Brechen der Update-Anweisung in 4 separate Update-Anweisungen zu starten . Anschließend können Sie die Verknüpfungen und Bedingungen für jede Metrik erstellen. Dann versuche später, es zu einem einzigen UPDATE zu machen. –
@RickS Guter Punkt, habe ich bearbeitet. – stack
Sie brauchen nicht das erste 'IF'. Wenn es keine passende Zeile gibt, wird nichts zusammengefügt. – Barmar