Scandal
Διαχειριστής
Ο Πέτρος αυτή τη στιγμή δεν είναι συνδεδεμένος. Είναι 35 ετών, επαγγέλεται Web developer και μας γράφει απο Περιστέρι (Αττική). Έχει γράψει 16,854 μηνύματα.
24-07-21
14:42
Τα έχω ψηλο πετύχει στο xenForo τα collection steams, αλλά αυτά δεν είναι για μικροεπεξεργασίες;Θέλω να σε βοηθήσω, πραγματικά, αλλά για κανένα λόγο.
Αυτόματη ένωση συνεχόμενων μηνυμάτων:
Φιλική σουμβουλή. Αντί να τα κάνεις όλα με SQL, απλά τα τράβα τα post που θέλεις και μετά κάνε αυτά που θέλεις με collection steams μέσα σε ένα JS ή PHP script. Π.χ. posts.filter( post => post.thread_id === "kati");
Αν δεν καταλαβαίνεις τι είναι αυτά που γράφω διάβασε για filter σε collections.
Ό,τι μπορώ να το κάνω με MySQL το κάνω, δεν υπάρχει λόγος να γίνει με PHP.
Ειδικά όταν μιλάμε για εκατομμύρια εγγραφές κι όχι 10δες / 1000δες.
Στη προκειμένη πχ μια άλλη λύση που είχα κάνει στην αρχή για να γλιτώσω το μεγάλο - βαρή query που προκαλεί το HAVING page_cnt > 1:
Μέσα σε ατέρμονη loop τράβαγα posts σε κύκλους (με το πιο απλό query).
Αν το μήνυμα βρισκόταν στη σελίδα 1, τότε το έκανε unset.
Η loop συνέχιζε να τραβάει posts σε κύκλους και να κάνει unset τα page_cnt = 1 και μόλις εντόπιζε sizeof($results) >= $results_number έκανε break.
Μετά με PHP έκανα sort τα results βάσει του κλειδιού post_thanks_amount και έκοβα τα όποια περιττά με την array_slice και την array_unique.
Scandal
Διαχειριστής
Ο Πέτρος αυτή τη στιγμή δεν είναι συνδεδεμένος. Είναι 35 ετών, επαγγέλεται Web developer και μας γράφει απο Περιστέρι (Αττική). Έχει γράψει 16,854 μηνύματα.
23-07-21
18:40
Λοιπόν, κατέληξα σε αυτό το τέρας που μάλλον δουλεύει
Τώρα γιατί έβαλα LIMIT 1000 στο subquery θα σας γελάω. Χωρίς LIMIT (που δε θα έπρεπε να τα τσεκάρει όλα; ) ή μικρή τιμή, δεν επέστρεφε σωστά- ολοκληρωμένα αποτελέσματα. Οπότε έβαλα ένα high value.
Υπολογίζω δύο φορές τη σελίδα, γιατί τη θέλω και στο main query / αποτελέσματα.
Τώρα γιατί έβαλα LIMIT 1000 στο subquery θα σας γελάω. Χωρίς LIMIT (που δε θα έπρεπε να τα τσεκάρει όλα; ) ή μικρή τιμή, δεν επέστρεφε σωστά- ολοκληρωμένα αποτελέσματα. Οπότε έβαλα ένα high value.
Υπολογίζω δύο φορές τη σελίδα, γιατί τη θέλω και στο main query / αποτελέσματα.
SQL:
SELECT post.*,
(SELECT FLOOR((COUNT(*) + 1) / $paginate) + 1
FROM `". TABLE_PREFIX ."post` AS z
WHERE z.postid < (SELECT q.postid
FROM `". TABLE_PREFIX ."post` AS q
WHERE post.postid > q.postid AND q.visible = 1 AND q.threadid = z.threadid
ORDER BY q.postid DESC
LIMIT 1)
AND z.threadid = post.threadid
AND z.visible = 1
) AS page_cnt
FROM (
SELECT p.postid, p.threadid, p.post_thanks_amount,
(SELECT FLOOR((COUNT(*) + 1) / $paginate) + 1
FROM `". TABLE_PREFIX ."post` AS u
WHERE u.postid < (SELECT s.postid
FROM `". TABLE_PREFIX ."post` AS s
WHERE p.postid > s.postid AND s.visible = 1 AND s.threadid = u.threadid
ORDER BY s.postid DESC
LIMIT 1)
AND u.threadid = p.threadid
AND u.visible = 1
) AS page_cnt_new
FROM `". TABLE_PREFIX ."post` AS p
LEFT JOIN `". TABLE_PREFIX ."thread` AS t USING (threadid)
WHERE t.forumid NOT IN ('" . implode("', '", $guest_no_access_forumids) . "')
". ($options['thread_age_x_days'] == 0 ? '' : " AND t.dateline < $seconds_thread_age" )."
AND p.visible = 1
".($options['window_range'] == 'max' ? '' : " AND p.dateline > $seconds_range" )."
AND p.dateline < $seconds_offset
AND p.post_thanks_amount >= $at_least_x_thanks
". ($options['ignore_post_if_on_page_1'] ? ' HAVING page_cnt_new > 1 ': '') ."
ORDER BY p.post_thanks_amount DESC, p.threadid DESC
LIMIT 1000
) AS x
LEFT JOIN `". TABLE_PREFIX ."post` AS post ON (post.postid = x.postid)
LEFT JOIN `". TABLE_PREFIX ."thread` AS thread ON (post.threadid = thread.threadid)
GROUP BY x.threadid
ORDER BY x.post_thanks_amount DESC, x.threadid DESC
LIMIT $results_number