thessalonik Δημοσ. 11 Φεβρουαρίου 2019 Δημοσ. 11 Φεβρουαρίου 2019 (επεξεργασμένο) Ρε παιδια μερες τωρα δυσκολευομαι να συνταξω την παρακατω if: name = request.args.get('name') month = request.args.get('month') year = request.args.get('year') if year: cur.execute( '''SELECT * FROM jobs WHERE YEAR(lastvisit) = %s ORDER BY lastvisit ASC''', year ) if name: cur.execute( '''SELECT * FROM jobs WHERE clientID = (SELECT id FROM clients WHERE name = %s) and YEAR(lastvisit) = %s ORDER BY lastvisit DESC''', (name, year) ) elif month: if name: cur.execute( '''SELECT * FROM jobs WHERE clientID = (SELECT id FROM clients WHERE name = %s) and MONTH(lastvisit) = %s and YEAR(lastvisit) = %s ORDER BY lastvisit DESC''', (name, month, year) ) else: cur.execute( '''SELECT * FROM jobs WHERE MONTH(lastvisit) = %s and YEAR(lastvisit) = %s ORDER BY lastvisit DESC''', (month, year) ) Ζηταω να δω αποτελεσματα με βαση τους εξης συνδυασμους απο 3 dropdwon menus. year name + year month + year name + month + year Εχω προσπαθησει να το γραψω με 10002 τροπους αλλα παλι δεν τα πετυχιανω και τα 4 αποτελεσματα Σε αυτο που εχω παραθεσει εαν ο χρηστης επιλεξει απο το dropdown menu mono το year η πρωτη cur.execute διενι αδειο συνολο δεδομενων ενω αυτα υπαρχουν. ΚΑθως επισης στο name + month + year γινεται επιστροφη δεδομενων ολου του χρονου αντι για τον συγκεκριμενο μηνα. Μπορειτε να με βοηθησετε να το γραψω σωστα? Επεξ/σία 11 Φεβρουαρίου 2019 από thessalonik
Fortistis Δημοσ. 11 Φεβρουαρίου 2019 Δημοσ. 11 Φεβρουαρίου 2019 Κάνε το template του full string που θες και αναλόγως με το τι έχεις βάζεις. Αλλιώς βάζεις κενό string.
thessalonik Δημοσ. 11 Φεβρουαρίου 2019 Μέλος Δημοσ. 11 Φεβρουαρίου 2019 Μπορεις να μου δωσεις ενα παραδειγμα?
Fortistis Δημοσ. 11 Φεβρουαρίου 2019 Δημοσ. 11 Φεβρουαρίου 2019 Πάρε την περίπτωση για name, month, year. Εάν έχεις και τα τρία, χρησιμοποιείς το string ως έχει. Αλλιώς, εάν δεν έχεις κάτι, τότε δεν συμπληρώνεις το αντίστοιχο κομμάτι. Π.χ. εάν δεν έχεις month, δεν βάζεις το 'and MONTH(lastvisit) = %s" αλλά string μηδενικού length. Το πώς ακριβώς θα το κάνεις να δουλέψει όπως θες, θα το βρεις.
thessalonik Δημοσ. 11 Φεβρουαρίου 2019 Μέλος Δημοσ. 11 Φεβρουαρίου 2019 (επεξεργασμένο) ετσι το διαμορφωσα οπωςλες, δες: if name and month and year: cur.execute( '''SELECT * FROM jobs WHERE clientID = (SELECT id FROM clients WHERE name = %s) and MONTH(lastvisit) = %s and YEAR(lastvisit) = %s ORDER BY lastvisit DESC''', (name, month, year) ) print( 1 ) elif name and year: cur.execute( '''SELECT * FROM jobs WHERE clientID = (SELECT id FROM clients WHERE name = %s) and YEAR(lastvisit) = %s ORDER BY lastvisit DESC''', (name, year) ) print( 2 ) elif month and year: cur.execute( '''SELECT * FROM jobs WHERE MONTH(lastvisit) = %s and YEAR(lastvisit) = %s ORDER BY lastvisit DESC''', (month, year) ) print( 3 ) elif year: cur.execute( '''SELECT * FROM jobs WHERE YEAR(lastvisit) = %s ORDER BY lastvisit ASC''', year ) print( 4 ) Its almost correct except the fast that the last "elif" never gets executed. Even if 'month=0', which mean no selection of month still this clause 'elif month and year:' always executes instead of the last one. Επεξ/σία 11 Φεβρουαρίου 2019 από thessalonik
Fortistis Δημοσ. 12 Φεβρουαρίου 2019 Δημοσ. 12 Φεβρουαρίου 2019 Δεν είπα αυτό. Μίλησα για string replacement αναλόγως με τι δεδομένα έχεις. 17 ώρες πριν, thessalonik είπε ts almost correct except the fast that the last "elif" never gets executed. Even if 'month=0', which mean no selection of month still this clause 'elif month and year:' always executes instead of the last one. Αυτό τι είναι; Μία ακόμα φορά... Αυτό που είπα σε οδηγεί να εκτελέσεις ένα ερώτημα αντί για 4. Μπορείς να ξεκινήσεις με το "select * from jobs" και μετά να αρχίζεις να κάνεις append τα strings που θες αναλόγως τις παραμέτρους που έχεις. Π.χ., εάν έχεις year, τότε κάνεις append το ('''WHERE YEAR(lastvisit) = %s ORDER BY lastvisit ASC''', year ) εάν δεν έχεις year, τότε κάνεις append το "". ΟΚ, βρήκα τι τρέχει:
k33theod Δημοσ. 12 Φεβρουαρίου 2019 Δημοσ. 12 Φεβρουαρίου 2019 Δεν ξέρω αν γίνεται όπως προτείνω name = request.args.get('name') month = request.args.get('month') year = request.args.get('year') function get_query_results(name = "", month="", year="") { return cur.execute( '''SELECT * FROM jobs WHERE clientID = (SELECT id FROM clients WHERE name = %s) and MONTH(lastvisit) = %s and YEAR(lastvisit) = %s ORDER BY lastvisit DESC''', (name, month, year) ) } δηλαδή δίνεις μια default τιμή = "" σε κάθε παράμετρο και γράφεις ένα query
thessalonik Δημοσ. 12 Φεβρουαρίου 2019 Μέλος Δημοσ. 12 Φεβρουαρίου 2019 Τελικα το εγραψα ετσι: if name and month != '0' and year != '0': cur.execute( '''SELECT * FROM jobs WHERE clientID = (SELECT id FROM clients WHERE name = %s) and MONTH(lastvisit) = %s and YEAR(lastvisit) = %s ORDER BY lastvisit DESC''', (name, month, year) ) elif name and year != '0': cur.execute( '''SELECT * FROM jobs WHERE clientID = (SELECT id FROM clients WHERE name = %s) and YEAR(lastvisit) = %s ORDER BY lastvisit DESC''', (name, year) ) elif month != '0' and year != '0': cur.execute( '''SELECT * FROM jobs WHERE MONTH(lastvisit) = %s and YEAR(lastvisit) = %s ORDER BY lastvisit DESC''', (month, year) ) elif year: cur.execute( '''SELECT * FROM jobs WHERE YEAR(lastvisit) = %s ORDER BY lastvisit ASC''', year ) Μπορει να γραφτει και συντομοτερα?!
doctorized Δημοσ. 13 Φεβρουαρίου 2019 Δημοσ. 13 Φεβρουαρίου 2019 12 ώρες πριν, thessalonik είπε Τελικα το εγραψα ετσι: if name and month != '0' and year != '0': cur.execute( '''SELECT * FROM jobs WHERE clientID = (SELECT id FROM clients WHERE name = %s) and MONTH(lastvisit) = %s and YEAR(lastvisit) = %s ORDER BY lastvisit DESC''', (name, month, year) ) elif name and year != '0': cur.execute( '''SELECT * FROM jobs WHERE clientID = (SELECT id FROM clients WHERE name = %s) and YEAR(lastvisit) = %s ORDER BY lastvisit DESC''', (name, year) ) elif month != '0' and year != '0': cur.execute( '''SELECT * FROM jobs WHERE MONTH(lastvisit) = %s and YEAR(lastvisit) = %s ORDER BY lastvisit DESC''', (month, year) ) elif year: cur.execute( '''SELECT * FROM jobs WHERE YEAR(lastvisit) = %s ORDER BY lastvisit ASC''', year ) Μπορει να γραφτει και συντομοτερα?! Να προτείνω στη θέση του %s αντι να βάζεις μόνο μήνα, έτος κλπ, να βάζεις και μέρος του query, πχ 'name = ....' ; εγώ σε php αυτό κάνω.
k33theod Δημοσ. 13 Φεβρουαρίου 2019 Δημοσ. 13 Φεβρουαρίου 2019 Σκέψου ότι έχεις 3 πεδία και χρειάστηκες 4 ερωτήματα. Τι θα γίνει αν τα πεδία γίνουν 4, αν γίνουν 5 ή 10. Θα μπορείς να γράψεις τέτοιο if; Εγώ πιστεύω πως όχι εκτός αν είσαι Robot😄. Οπότε προτείνω να αφήσεις τα if.
doctorized Δημοσ. 13 Φεβρουαρίου 2019 Δημοσ. 13 Φεβρουαρίου 2019 1 ώρα πριν, k33theod είπε Σκέψου ότι έχεις 3 πεδία και χρειάστηκες 4 ερωτήματα. Τι θα γίνει αν τα πεδία γίνουν 4, αν γίνουν 5 ή 10. Θα μπορείς να γράψεις τέτοιο if; Εγώ πιστεύω πως όχι εκτός αν είσαι Robot😄. Οπότε προτείνω να αφήσεις τα if. Και 1000 να γίνουν μπορούμε να έχουμε ένα if για κάθε στοιχείο το οποίο θα φτιάχνει το ' and..... ' και θα το κοτσαρουμε στο τέλος του βασικού query. Τι κερδίζει έτσι; Δεν χρειάζεται να συμπεριλάβει όλους τους πιθανούς συνδυασμούς που δημιουργούνται. Αν παραμείνει έτσι μπορεί απλώς να αντικαθιστά τα %s με τις τιμές που θέλει. Μη φέρνουμε πάντα την καταστροφή, "αν ήταν 100, αν το ένα, αν το άλλο". Καταλαβαίνω γίνεται με καλή πρόθεση για να βοηθήσουμε μελλοντικά αλλά καλό είναι να εστιάζουμε στο πρόβλημα τώρα όπως είναι και όχι όπως θα μπορούσε να γίνει στο μέλλον. Αν γίνει πιο πολύπλοκο τότε τα ξαναλέμε. Δεν χρειάζεται από τώρα τόσο μπιρι-μπιρι. 1
k33theod Δημοσ. 13 Φεβρουαρίου 2019 Δημοσ. 13 Φεβρουαρίου 2019 (επεξεργασμένο) 44 λεπτά πριν, doctorized είπε Και 1000 να γίνουν μπορούμε να έχουμε ένα if για κάθε στοιχείο το οποίο θα φτιάχνει το ' and..... ' και θα το κοτσαρουμε στο τέλος του βασικού query. Τι κερδίζει έτσι; Δεν χρειάζεται να συμπεριλάβει όλους τους πιθανούς συνδυασμούς που δημιουργούνται. Αν παραμείνει έτσι μπορεί απλώς να αντικαθιστά τα %s με τις τιμές που θέλει. Μη φέρνουμε πάντα την καταστροφή, "αν ήταν 100, αν το ένα, αν το άλλο". Καταλαβαίνω γίνεται με καλή πρόθεση για να βοηθήσουμε μελλοντικά αλλά καλό είναι να εστιάζουμε στο πρόβλημα τώρα όπως είναι και όχι όπως θα μπορούσε να γίνει στο μέλλον. Αν γίνει πιο πολύπλοκο τότε τα ξαναλέμε. Δεν χρειάζεται από τώρα τόσο μπιρι-μπιρι. είσαι σίγουρος; γιατί δεν γράφει απλά if, γράφει if στα οποία έχει μέσα λογικά end από άλλα στοιχεία. Μόλις του βγάλει ένα λάθος θα κάνει μια βδομάδα να το βρει. Δεν σχολιάζω την λύση που του προτείνες εσύ σχολίαζω τη λύση που αυτός thessalonik κατέληξε. Επεξ/σία 13 Φεβρουαρίου 2019 από k33theod
doctorized Δημοσ. 13 Φεβρουαρίου 2019 Δημοσ. 13 Φεβρουαρίου 2019 26 λεπτά πριν, k33theod είπε είσαι σίγουρος; γιατί δεν γράφει απλά if, γράφει if στα οποία έχει μέσα λογικά end από άλλα στοιχεία. Μόλις του βγάλει ένα λάθος θα κάνει μια βδομάδα να το βρει. Δεν σχολιάζω την λύση που του προτείνες εσύ σχολίαζω τη λύση που αυτός thessalonik κατέληξε. Πιστεύω γίνεται με κατάλληλο χειρισμό.
masteripper Δημοσ. 13 Φεβρουαρίου 2019 Δημοσ. 13 Φεβρουαρίου 2019 Όταν τα IF αρχίζουν και πολλαπλασιάζοντας αφήνεις τον κλασσικό στατικό και μεταβαίνεις σε TOP (Table Oriented Programming)
thessalonik Δημοσ. 13 Φεβρουαρίου 2019 Μέλος Δημοσ. 13 Φεβρουαρίου 2019 Δηλαδη ρε παιδια πως θα μπορουσα να το γραψω πιο συντομα?
Προτεινόμενες αναρτήσεις
Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε
Πρέπει να είστε μέλος για να αφήσετε σχόλιο
Δημιουργία λογαριασμού
Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!
Δημιουργία νέου λογαριασμούΣύνδεση
Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.
Συνδεθείτε τώρα