Εξαγωγή αποτελεσμάτων βάσει dateline

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

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

Απάντηση
alou
Script Master
Δημοσιεύσεις: 1374
Εγγραφή: 24 Αύγ 2007 19:52
Επικοινωνία:

Εξαγωγή αποτελεσμάτων βάσει dateline

Δημοσίευση από alou » 16 Απρ 2014 13:58

Το ένα περιλαμβάνει την περίπτωση να είναι ίσα και το άλλο όχι, μαθηματικά είναι τα σύμβολα.

Για το closing_soon, θες ένα ξεχωριστό query με between για να επιλέξεις μόνο αυτά φαντάζομαι (?) αν και εγώ θα προτιμούσα να το κάνω στο view, με php και να προσθέσω ένα css class εκεί πέρα για να το ξεχωρίσω, γλιτώνοντας και το extra query, πιθανώς φέρνοντας έτοιμο το υπόλοιπο του χρόνου για κάθε item

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

SELECT (FROM_UNIXTIME(dateline) + INTERVAL `closing` DAY) - NOW() ) as time_remaining, fielda, fieldb ... from table where ...
Αν θες να τα επιλέξεις σε ένα ξεχωριστό query, δοκίμασε κάτι τέτοιο

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

SELECT * FROM table WHERE FROM_UNIXTIME(dateline) BETWEEN (NOW() - INTERVAL `closing` DAY) AND (NOW() - INTERVAL closing * 24 - 1 hour) 

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

Εξαγωγή αποτελεσμάτων βάσει dateline

Δημοσίευση από philos » 16 Απρ 2014 17:18

Σε ευχαριστώ, δουλεύει μια χαρά το ξεχωριστό query που έγραψες, θα αναφέρω και μια παρατήρηση παρακάτω. :)

Για να μπούμε πιο πραγματικά στο πρόβλημα, το ξεχωριστό αυτό query (FROM_UNIXTIME(dateline) BETWEEN (NOW() - INTERVAL `closing` DAY) AND (NOW() - INTERVAL closing * 24 - 1 hour)) θα τρέχει σε ένα cron job το οποίο θα είναι προγραμματισμένο να τρέχει κάθε 1 ώρα ώστε να μαρκάρει τα θέματα που θα κλείσουν σύντομα - εντός της ώρας (closing_soon = 1).
Εν συνεχεία, ένα cron που θα τρέχει κάθε 1-2 λεπτά, θα τσεκάρει μόνο τα θέματα που είναι closing_soon, και αν είναι για κλείσιμο, θα τα κλειδώνει (FROM_UNIXTIME(dateline) <= (NOW() - INTERVAL `closing` DAY)).

Το closing_soon το χρησιμοποιούμε στην ουσία για να διευκολύνουμε- ελαφρύνουμε το cron που θα τρέχει κάθε 1-2 λεπτά (για να μην τσεκάρει τα 10000δες και παραπάνω θέματα από το μηδέν).

Όμως αν το site δεν έχει επισκέπτη, τα cron μπορεί να μένουν "πίσω". Το συγκεκριμένο query - (FROM_UNIXTIME(dateline) BETWEEN (NOW() - INTERVAL `closing` DAY) AND (NOW() - INTERVAL closing * 24 - 1 hour)) - περιλαμβάνει μόνο τα θέματα που θα κλείσουν εντός 1 ώρας - αν δεν τρέξει στην ώρα του, μπορεί να του διαφύγουν θέματα (πχ σε δοκιμές ένα θέμα θα έπρεπε να είχε μαρκαριστεί ως closing_soon, αλλά δεν μαρκαρίστηκε επειδή δεν έτρεξε το ωριαίο cron στην ώρα του αλλά 2-3 ώρες μετέπειτα με αποτέλεσμα να του "διαφύγει" το θέμα).
Πως το φιξάρω αυτό;

alou
Script Master
Δημοσιεύσεις: 1374
Εγγραφή: 24 Αύγ 2007 19:52
Επικοινωνία:

Εξαγωγή αποτελεσμάτων βάσει dateline

Δημοσίευση από alou » 16 Απρ 2014 18:10

Ti ακριβώς εννοείς cron; υπάρχει κάποιο crontab σε linux ή κάποιο ψευδο cron σε php από κανένα wordpress κλπ?
http://en.wikipedia.org/wiki/Cron

Αν έχεις shell access crontab -e ή αν έχεις plesk / cpanel έχουν web interface για το crontab.

To cron είναι daemon, δε χρειάζεται trigger από επίσκεψη, να προσέξεις αν θα πρέπει να τρέχει κάθε 59 λεπτά ή μια ώρα ανάλογα με το select και τα <= ή =

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

Εξαγωγή αποτελεσμάτων βάσει dateline

Δημοσίευση από philos » 16 Απρ 2014 18:28

alou έγραψε:Ti ακριβώς εννοείς cron; υπάρχει κάποιο crontab σε linux ή κάποιο ψευδο cron σε php από κανένα wordpress κλπ?
http://en.wikipedia.org/wiki/Cron

Αν έχεις shell access crontab -e ή αν έχεις plesk / cpanel έχουν web interface για το crontab.

To cron είναι daemon, δε χρειάζεται trigger από επίσκεψη, να προσέξεις αν θα πρέπει να τρέχει κάθε 59 λεπτά ή μια ώρα ανάλογα με το select και τα <= ή =
Ψευδο cron σε php είναι (του vBulletin) και χρειάζεται επισκέπτης για να τρέξουν. Οπότε το ωριαίο cron θα πρέπει να καλύπτει κάπως την περίπτωση που καθυστερήσει να τρέξει.

alou
Script Master
Δημοσιεύσεις: 1374
Εγγραφή: 24 Αύγ 2007 19:52
Επικοινωνία:

Εξαγωγή αποτελεσμάτων βάσει dateline

Δημοσίευση από alou » 16 Απρ 2014 18:35

Ή θα φτιάξεις κανονικό cron (εννοείται πως το προτιμάς) ή κάποιον επιπλέον πίνακα που θα ενημερώνει και θα τσεκάρει το script για την τελευταία φορά που έτρεξε το ψευδο cron, αλλάζοντας αντίστοιχα και τα διαστήματα του between ...

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

Εξαγωγή αποτελεσμάτων βάσει dateline

Δημοσίευση από philos » 16 Απρ 2014 19:11

hmmm δε μπορώ να αποφύγω το να αποθηκεύω επιπλέον την τελευταία φορά που έτρεξε το cron; Δηλαδή με κάποιο τρόπο να γίνονται όλα με το query του ωριαίου cron;

Μήπως στο ωριαίο cron να βάλω:

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

FROM_UNIXTIME&#40;dateline&#41; BETWEEN &#40;NOW&#40;&#41; - INTERVAL `closing` DAY&#41; AND &#40;NOW&#40;&#41; - INTERVAL closing * 24 - 1 hour&#41; OR FROM_UNIXTIME&#40;dateline&#41; <= &#40;NOW&#40;&#41; - INTERVAL `closing` DAY&#41;
δηλαδή επιπλέον ένα OR + τη WHERE του άλλου - συχνού - cron που συζητάγαμε.. ώστε να μαρκάρει και αυτά που πράγματι έχουν λήξει ως closing_soon και ύστερα το συχνό cron των 1-2 λεπτών να τα κλείνει;

alou
Script Master
Δημοσιεύσεις: 1374
Εγγραφή: 24 Αύγ 2007 19:52
Επικοινωνία:

Εξαγωγή αποτελεσμάτων βάσει dateline

Δημοσίευση από alou » 16 Απρ 2014 22:23

Δε γίνεται αυτό που λες έτσι, σου είπα τη γνώμη μου και τις 2 πιο λογικές εναλλακτικές που σκέφτηκα. Ή, αν θες να παραμείνεις με αυτού του είδους τα cron, τρέξε και ένα διαφορετικό 1-2 φορές την ημέρα μετά τις ώρες που δεν υπάρχουν επισκέψεις για να πιάσεις αυτά που ξέφυγαν. Αλλά όλα αυτά είναι ημίμετρα που λύνονται πολύ πιο εύκολα και σωστά με ένα κανονικό cron, δεν καταλαβαίνω γιατί δεν το κάνεις έτσι.

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

Εξαγωγή αποτελεσμάτων βάσει dateline

Δημοσίευση από philos » 16 Απρ 2014 22:36

Θα ήθελα να παραμείνω στο php ψευδο-cron του vBulletin ώστε η λειτουργία που φτιάχνω να μπορεί να εγκατασταθεί εύκολα και από άλλους χρήστες vBulletin που είναι απλοί χρήστες - διαχειριστές - δηλαδή να είναι σαν πακέτο.

Το ακόλουθο που είπα παραπάνω γιατί δεν θα δουλέψει;

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

&#40;FROM_UNIXTIME&#40;dateline&#41; BETWEEN &#40;NOW&#40;&#41; - INTERVAL `closing` DAY&#41; AND &#40;NOW&#40;&#41; - INTERVAL closing * 24 - 1 hour&#41;&#41; OR &#40;FROM_UNIXTIME&#40;dateline&#41; <= &#40;NOW&#40;&#41; - INTERVAL `closing` DAY&#41;&#41;
.. την ουσία τραβάει αυτά που λήγουν εντός μιας ώρας + αυτά που έχουν ήδη λήξει (για την περίπτωση που ξέφυγαν) και τα μαρκάρει κι αυτά ως closing_soon ώστε να τα περιλάβει-κλειδώσει μετά το συχνό cron το οποίο μαζί με το FROM_UNIXTIME(dateline) <= (NOW() - INTERVAL `closing` DAY) έχει και ένα AND closing_soon = 1.

alou
Script Master
Δημοσιεύσεις: 1374
Εγγραφή: 24 Αύγ 2007 19:52
Επικοινωνία:

Εξαγωγή αποτελεσμάτων βάσει dateline

Δημοσίευση από alou » 17 Απρ 2014 09:20

Το query θέλει λίγο δουλειά αλλά το θέμα είναι, έστω για λίγα λεπτά, θα μαρκάρεις ΟΛΑ αυτά που έχουν λήξει ως closing soon? Αφού θες να το κάνεις κάπως έτσι, τουλάχιστον φτιάξε όπως σου είπα ένα πίνακα και ενημέρωνέ τον με ένα timestamp κάθε φορά που τρέχει το μεγάλο query.
Μετά θα τσεκάρεις την τελευταία φορά που έτρεξε και θα αλλάζεις το χρονικό διάστημα στο between. Ή αν επιμένεις κάνε αυτό που λες που όμως κατά τη γνώμη μου είναι λάθος για πολλούς λόγους.

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

Εξαγωγή αποτελεσμάτων βάσει dateline

Δημοσίευση από philos » 17 Απρ 2014 14:49

alou έγραψε:Το query θέλει λίγο δουλειά αλλά το θέμα είναι, έστω για λίγα λεπτά, θα μαρκάρεις ΟΛΑ αυτά που έχουν λήξει ως closing soon? Αφού θες να το κάνεις κάπως έτσι, τουλάχιστον φτιάξε όπως σου είπα ένα πίνακα και ενημέρωνέ τον με ένα timestamp κάθε φορά που τρέχει το μεγάλο query.
Μετά θα τσεκάρεις την τελευταία φορά που έτρεξε και θα αλλάζεις το χρονικό διάστημα στο between. Ή αν επιμένεις κάνε αυτό που λες που όμως κατά τη γνώμη μου είναι λάθος για πολλούς λόγους.
Μόλις διαπίστωσα ότι μπορώ να τραβήξω την timestamp της τελευταίας φοράς που έτρεξε το ψευδο-cron από το cronlog (το οποίο αναλαμβάνει το σύστημα να ενημερώνει κτλ) αντί να το έφτιαχνα εγώ με save σε κάποιον νέο πίνακα.

Οπότε έχοντας την timestamp (σε μια php μεταβλητή), πως αλλάζουμε το:

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

FROM_UNIXTIME&#40;dateline&#41; BETWEEN &#40;NOW&#40;&#41; - INTERVAL `closing` DAY&#41; AND &#40;NOW&#40;&#41; - INTERVAL closing * 24 - 1 hour&#41;
;

Thanks :)

alou
Script Master
Δημοσιεύσεις: 1374
Εγγραφή: 24 Αύγ 2007 19:52
Επικοινωνία:

Εξαγωγή αποτελεσμάτων βάσει dateline

Δημοσίευση από alou » 17 Απρ 2014 15:33

Δεν είμαι και πολύ σίγουρος αλλά δοκίμασε αυτό:

έστω ότι $extratime είναι λεπτά που προκύπτουν από το τώρα - την τελευταία φορά που έτρεξε το cron (σε λεπτά)

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

FROM_UNIXTIME&#40;dateline&#41; BETWEEN &#40;NOW&#40;&#41; - INTERVAL `closing` DAY&#41; AND &#40;NOW&#40;&#41; - INTERVAL closing * 1440 - $extratime MINUTE&#41;

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

Εξαγωγή αποτελεσμάτων βάσει dateline

Δημοσίευση από philos » 18 Απρ 2014 19:42

Δουλεύει μια χαρά! Σε ευχαριστώ :)

Απάντηση

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

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

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