MySQL query και PHP/ βέλτιστος τρόπος για UPDATE και SUM υπολογισμούς

Συζητήσεις για την βάση δεδομένων MySQL και το phpMyAdmin

Συντονιστές: WebDev Moderators, Super-Moderators

Απάντηση
Άβαταρ μέλους
philos
Δημοσιεύσεις: 263
Εγγραφή: 30 Αύγ 2007 23:32

MySQL query και PHP/ βέλτιστος τρόπος για UPDATE και SUM υπολογισμούς

Δημοσίευση από philos » 04 Ιούλ 2017 16:44

Καλημέρα!
Λοιπόν, έχουμε τον ακόλουθο κώδικα που υπολογίζει τα points ενός συστήματος "awards".
Ο πίνακας award έχει τα awards και ο award_user, τα δεδομένα του σε ποιον χρήση έχει δοθεί, ποιο award.

Κώδικας: Επιλογή όλων

$userpoints = $db->query_first('
                SELECT award.*, award_user.*, SUM(award_pointvalue) AS TotalPoints, COUNT(award_user.issue_id) AS TotalAwards
                FROM ' . TABLE_PREFIX . 'award_user AS award_user
                LEFT JOIN ' . TABLE_PREFIX . 'award AS award USING (award_id)
                WHERE award_user.userid = '. intval($userid) . '
                AND award.award_active = "1"
                GROUP BY award_user.userid
            ');

$vbulletin->db->query_write("UPDATE " . TABLE_PREFIX . "user 
								 SET sc_awards_number = ". intval($userpoints['TotalAwards']) .",
									 sc_awards_points = ". intval($userpoints['TotalPoints']) ."
								WHERE userid = " . intval($userid) . "");
Το θέμα: ο παραπάνω κώδικας, μπορεί να θέλω να τρέξει, ας πούμε για κάποιες χιλιάδες userids σε μια while ( ; ) *

Έχετε να προτείνετε κάποια τροποποίηση στον κώδικα χάρην απόδοσης;
Κάτι που έχω κατά νου:
- Ίσως το $userpoints query μπορεί να ενσωματωθεί ως υποερώτημα στην UPDATE; Αν γίνεται κάτι τέτοιο, ποια η σύνταξη;
- Ακόμα πιο προχωριμένα: μπορεί να ενσωματωθεί ως υποερώτημα στην UPDATE + να μπει ένα "WHERE userid IN ();

* Βασικά για να σας δώσω να καταλάβετε τι θέλω να κάνω: θέλω για συγκεκριμένα award_ids να ενημερώσω το sc_awards_number και sc_awards_points του πίνακα user, για τους χρήστες που έχουν το/τα συγκεκριμένα award_id(s).
Αυτή τη στιγμή, τραβάω τους χρήστες από το award_user και σε μια php while τρέχω τον από πάνω κώδικα. Απλά όταν ένα ή περισσότερα awards έχουν 1000 δες χρήστες, νομίζω η προσεγγισή μου δεν είναι και η καλύτερη.

Κάθε βοήθεια ευπρόσδεκτη. :-)

Άβαταρ μέλους
dva_dev
Script Master
Δημοσιεύσεις: 3790
Εγγραφή: 16 Σεπ 2005 01:32
Επικοινωνία:

Re: MySQL query και PHP/ βέλτιστος τρόπος για UPDATE και SUM υπολογισμούς

Δημοσίευση από dva_dev » 09 Ιούλ 2017 14:02

Για δοκίμασε αν σου κάνει κάποιο query σαν αυτό:

Κώδικας: Επιλογή όλων

$query = 'UPDATE ' . TABLE_PREFIX . 'user INNER JOIN (' .
'SELECT award_user.userid, SUM(award_pointvalue) AS TotalPoints, COUNT(award_user.issue_id) AS TotalAwards' .
'FROM ' . TABLE_PREFIX . 'award_user AS award_user' .
'LEFT JOIN ' . TABLE_PREFIX . 'award AS award USING (award_id)' .
'WHERE award.award_active = 1' .
'GROUP BY award_user.userid' .
') AS tmp' .
'USING (userid)' .
'SET sc_awards_number = tmp.TotalAwards,' .
'sc_awards_points = tmp.TotalPoints';

Απάντηση

Επιστροφή στο “MySQL”

Μέλη σε σύνδεση

Μέλη σε αυτήν τη Δ. Συζήτηση: Δεν υπάρχουν εγγεγραμμένα μέλη και 1 επισκέπτης