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
05:49
Θα ήθελα τη βοήθεια των ειδικό(τερων), πάνω σε ένα MySQL query.
Προειδοποιώ ότι δεν είναι απλό
Έχουμε δύο πίνακες:
τον thread με στήλες:
threadid
title
και τον post με στήλες:
postid
threadid
dateline (σφραγίδα χρόνου)
post_thanks_amount (int)
Άλλα δεδομένα:
τα post κάθε thread χωρίζονται ανά 10 σε κάθε σελίδα.
Τι θέλω να πάρω:
Το post κάθε thread:
- με το μέγιστο (MAX) post_thanks_amount (μέσα σε ένα thread)
- όμως θέλω να επιλέξω το MAX εξαιρώντας ως επιλογή, posts της 1ης σελίδας
- καθώς και άλλες επεξεργασίες στην επιλογή του post που τελικά θα κριθεί ως μέγιστο
Ουσιαστικά ζητάω MAX βάσει κριτηρίων (GROUP BY threadid) κι όχι το MAX του thread γενικά.
Tip: με το ακόλουθο query μπορείς να υπολογίσεις τη σελίδα κάθε post:
Για να μην το κουράζω, σας επισυνάπτω τι έχω γράψει
QUERY A: Αν τρέξω αυτό το query παίρνω κάποια αποτελέσματα (τα μηνύματα με τουλάχιστον x likes μέσα σε μια χρονική περίοδο και εκτός της 1ης σελίδας).
Αυτό το query λοιπόν τρέχει σωστά.
Το ακόλουθο όμως, που είναι και ο λόγος που άνοιξα το thread, δεν παρουσιάζει μια σχετική συνάφεια στα αποτελέσματα με το query A.
Ειδικότερα, κάποια (πολύ λίγα) threads φαίνονται στο Α αλλά δεν φαίνονται στο Β κι ας πληρούνται οι προυποθέσεις.
QUERY B:
Καμιά ιδέα για το query B;
Ξέρω είναι τεράστιο αλλά το μπαλώνω από εδώ κι από εκεί εδώ και 10 ώρες
Pls μην με σνομπάρετε
Αν έχετε κατά νου ένα δικό σας mysql query που μπορεί να εξάγει τα αποτελέσματα που θέλω ή διόρθωση στο υπάρχον Β, ευπρόσδεκτα όλα!
Διαβάζω ότι ουσιαστικά η ORDER BY και η GROUP BY δεν λειτουργούν μαζί...
Προειδοποιώ ότι δεν είναι απλό
Έχουμε δύο πίνακες:
τον thread με στήλες:
threadid
title
και τον post με στήλες:
postid
threadid
dateline (σφραγίδα χρόνου)
post_thanks_amount (int)
Άλλα δεδομένα:
τα post κάθε thread χωρίζονται ανά 10 σε κάθε σελίδα.
Τι θέλω να πάρω:
Το post κάθε thread:
- με το μέγιστο (MAX) post_thanks_amount (μέσα σε ένα thread)
- όμως θέλω να επιλέξω το MAX εξαιρώντας ως επιλογή, posts της 1ης σελίδας
- καθώς και άλλες επεξεργασίες στην επιλογή του post που τελικά θα κριθεί ως μέγιστο
Ουσιαστικά ζητάω MAX βάσει κριτηρίων (GROUP BY threadid) κι όχι το MAX του thread γενικά.
Tip: με το ακόλουθο query μπορείς να υπολογίσεις τη σελίδα κάθε post:
SQL:
(SELECT FLOOR((COUNT(*) + 1) / 10) + 1
FROM `". TABLE_PREFIX ."post` AS s
WHERE s.postid < (SELECT t.postid
FROM `". TABLE_PREFIX ."post` AS t
WHERE post.postid > t.postid AND t.visible = 1 AND t.threadid = s.threadid
ORDER BY t.postid DESC
LIMIT 1)
AND s.threadid = post.threadid
AND s.visible = 1
) AS page_cnt
Για να μην το κουράζω, σας επισυνάπτω τι έχω γράψει
QUERY A: Αν τρέξω αυτό το query παίρνω κάποια αποτελέσματα (τα μηνύματα με τουλάχιστον x likes μέσα σε μια χρονική περίοδο και εκτός της 1ης σελίδας).
SQL:
SELECT post.*, (SELECT FLOOR((COUNT(*) + 1) / 10) + 1
FROM `". TABLE_PREFIX ."post` AS s
WHERE s.postid < (SELECT t.postid
FROM `". TABLE_PREFIX ."post` AS t
WHERE post.postid > t.postid AND t.visible = 1 AND t.threadid = s.threadid
ORDER BY t.postid DESC
LIMIT 1)
AND s.threadid = post.threadid
AND s.visible = 1
) AS page_cnt
FROM `". TABLE_PREFIX ."post` AS post
LEFT JOIN `". TABLE_PREFIX ."thread` AS thread USING (threadid)
WHERE post.visible = 1
".($options['window_range'] == 'max' ? '' : " AND post.dateline > $seconds_range" )."
AND post.dateline < $seconds_offset
AND post.post_thanks_amount >= $at_least_x_thanks
AND thread.dateline < $seconds_thread_age
AND thread.forumid NOT IN ('" . implode("', '", $guest_no_access_forumids) . "')
HAVING page_cnt > 1
ORDER BY post.post_thanks_amount DESC, thread.threadid DESC
LIMIT $results_number
Το ακόλουθο όμως, που είναι και ο λόγος που άνοιξα το thread, δεν παρουσιάζει μια σχετική συνάφεια στα αποτελέσματα με το query A.
Ειδικότερα, κάποια (πολύ λίγα) threads φαίνονται στο Α αλλά δεν φαίνονται στο Β κι ας πληρούνται οι προυποθέσεις.
QUERY B:
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 `". TABLE_PREFIX ."thread` AS thread
LEFT JOIN `". TABLE_PREFIX ."post` AS post ON (post.threadid = thread.threadid)
WHERE thread.dateline < $seconds_thread_age
AND thread.forumid NOT IN ('" . implode("', '", $guest_no_access_forumids) . "')
AND post.visible = 1
".($options['window_range'] == 'max' ? '' : " AND post.dateline > $seconds_range" )."
AND post.dateline < $seconds_offset
AND post.post_thanks_amount >= $at_least_x_thanks
GROUP BY thread.threadid
". ($options['ignore_post_if_on_page_1'] ? ' HAVING page_cnt > 1 ': '') ."
ORDER BY post.post_thanks_amount DESC, thread.threadid DESC
LIMIT $results_number
Καμιά ιδέα για το query B;
Ξέρω είναι τεράστιο αλλά το μπαλώνω από εδώ κι από εκεί εδώ και 10 ώρες
Pls μην με σνομπάρετε
Αν έχετε κατά νου ένα δικό σας mysql query που μπορεί να εξάγει τα αποτελέσματα που θέλω ή διόρθωση στο υπάρχον Β, ευπρόσδεκτα όλα!
Διαβάζω ότι ουσιαστικά η ORDER BY και η GROUP BY δεν λειτουργούν μαζί...