Προς το περιεχόμενο

Προτεινόμενες αναρτήσεις

Δημοσ. (επεξεργασμένο)

Ρε παιδια μερες τωρα δυσκολευομαι να συνταξω την παρακατω 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 γινεται επιστροφη δεδομενων ολου του χρονου αντι για τον συγκεκριμενο μηνα.

Μπορειτε να με βοηθησετε να το γραψω σωστα?

 

Επεξ/σία από thessalonik
Δημοσ.

Πάρε την περίπτωση για name, month, year. Εάν έχεις και τα τρία, χρησιμοποιείς το string ως έχει. Αλλιώς, εάν δεν έχεις κάτι, τότε δεν συμπληρώνεις το αντίστοιχο κομμάτι. 

Π.χ. εάν δεν έχεις month, δεν βάζεις το 'and MONTH(lastvisit) = %s" αλλά string μηδενικού length. 

Το πώς ακριβώς θα το κάνεις να δουλέψει όπως θες, θα το βρεις. 

Δημοσ. (επεξεργασμένο)

ετσι το διαμορφωσα οπωςλες,  δες:

 

		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.

Επεξ/σία από thessalonik
Δημοσ.

Δεν είπα αυτό. Μίλησα για 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 το "". 

ΟΚ, βρήκα τι τρέχει: 

 

Δημοσ.

Δεν ξέρω αν γίνεται όπως προτείνω

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

Δημοσ.

Τελικα το εγραψα ετσι:

 

		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 )

Μπορει να γραφτει και συντομοτερα?!

Δημοσ.
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 αυτό κάνω. 

Δημοσ.

Σκέψου ότι έχεις 3 πεδία και χρειάστηκες 4 ερωτήματα.

Τι θα γίνει αν τα πεδία γίνουν 4, αν γίνουν 5 ή 10. Θα μπορείς να γράψεις τέτοιο if;  Εγώ πιστεύω πως όχι εκτός αν είσαι Robot😄.

Οπότε προτείνω να αφήσεις τα if.

Δημοσ.
1 ώρα πριν, k33theod είπε

Σκέψου ότι έχεις 3 πεδία και χρειάστηκες 4 ερωτήματα.

Τι θα γίνει αν τα πεδία γίνουν 4, αν γίνουν 5 ή 10. Θα μπορείς να γράψεις τέτοιο if;  Εγώ πιστεύω πως όχι εκτός αν είσαι Robot😄.

Οπότε προτείνω να αφήσεις τα if.

Και 1000 να γίνουν μπορούμε να έχουμε ένα if για κάθε στοιχείο το οποίο θα φτιάχνει το ' and..... ' και θα το κοτσαρουμε στο τέλος του βασικού query. Τι κερδίζει έτσι; Δεν χρειάζεται να συμπεριλάβει όλους τους πιθανούς συνδυασμούς που δημιουργούνται. Αν παραμείνει έτσι μπορεί απλώς να αντικαθιστά τα %s με τις τιμές που θέλει. Μη φέρνουμε πάντα την καταστροφή, "αν ήταν 100, αν το ένα, αν το άλλο". Καταλαβαίνω γίνεται με καλή πρόθεση για να βοηθήσουμε μελλοντικά αλλά καλό είναι να εστιάζουμε στο πρόβλημα τώρα όπως είναι και όχι όπως θα μπορούσε να γίνει στο μέλλον. Αν γίνει πιο πολύπλοκο τότε τα ξαναλέμε. Δεν χρειάζεται από τώρα τόσο μπιρι-μπιρι. 

  • Confused 1
Δημοσ. (επεξεργασμένο)
44 λεπτά πριν, doctorized είπε

Και 1000 να γίνουν μπορούμε να έχουμε ένα if για κάθε στοιχείο το οποίο θα φτιάχνει το ' and..... ' και θα το κοτσαρουμε στο τέλος του βασικού query. Τι κερδίζει έτσι; Δεν χρειάζεται να συμπεριλάβει όλους τους πιθανούς συνδυασμούς που δημιουργούνται. Αν παραμείνει έτσι μπορεί απλώς να αντικαθιστά τα %s με τις τιμές που θέλει. Μη φέρνουμε πάντα την καταστροφή, "αν ήταν 100, αν το ένα, αν το άλλο". Καταλαβαίνω γίνεται με καλή πρόθεση για να βοηθήσουμε μελλοντικά αλλά καλό είναι να εστιάζουμε στο πρόβλημα τώρα όπως είναι και όχι όπως θα μπορούσε να γίνει στο μέλλον. Αν γίνει πιο πολύπλοκο τότε τα ξαναλέμε. Δεν χρειάζεται από τώρα τόσο μπιρι-μπιρι. 

είσαι σίγουρος; γιατί δεν γράφει απλά if, γράφει if στα οποία έχει μέσα λογικά end από άλλα στοιχεία. Μόλις του βγάλει ένα λάθος θα κάνει μια βδομάδα να το βρει. Δεν σχολιάζω την λύση που του προτείνες εσύ σχολίαζω τη λύση που αυτός thessalonik κατέληξε.

Επεξ/σία από k33theod
Δημοσ.
26 λεπτά πριν, k33theod είπε

είσαι σίγουρος; γιατί δεν γράφει απλά if, γράφει if στα οποία έχει μέσα λογικά end από άλλα στοιχεία. Μόλις του βγάλει ένα λάθος θα κάνει μια βδομάδα να το βρει. Δεν σχολιάζω την λύση που του προτείνες εσύ σχολίαζω τη λύση που αυτός thessalonik κατέληξε.

Πιστεύω γίνεται με κατάλληλο χειρισμό. 

Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!

Δημιουργία νέου λογαριασμού

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα
  • Δημιουργία νέου...