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

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

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

καλησπέρα, προσπαθώ να κάνω ένα απλό μαλλον ερώτημα, αλλά οι γνώσεις μου δεν με βοηθούν ακόμα.

Καταρχήν με ενδιαφέρει να το τρέξω σε mysql, άρα μάλλον περιορίζομαι σε standard sql εντολες.

Η βάση μου είναι η κλιμάκωση του σκορ σε έναν ποδοσφαιρικό αγώνα.

 

έστω:

 

# idfootball_score, points_home, points_away, total_home, total_away, minute, period
1, 1, 0, 1, 0, 5, 1
2, 0, 1, 1, 1, 15, 1
3, 1, 0, 2, 1, 33, 1
4, 1, 0, 3, 1, 46, 1
5, 1, 0, 4, 1, 46, 2
 

η λογική είναι στα points_home -away ποιος σκόραρε, μετά έχω το σύνολο μετά από κάθε γκολ, μετά σε ποιο λεπτό μπήκε και μετά σε ποιο ημίχρονο.

 

Θέλω να γράψω ένα query που να μου επιστρέφει home αν η πρώτη ομάδα που έβαλε γκολ πριν το 30 ειναι η γηπεδουχος, away για την φιλοξενούμενη ή none για καμία.

 

Το παρακάτω μου επιστρέφει το ¨πρώτο γκολ  μέχρι το 30. Πως μπορώ να κάνω τον παραπάνω έλεγχο ομως;

 	select points_home, points_away

		from football_score 

		where minute <=30
		limit 1

Επίσης έχω γράψει αυτό, αλλά μου επιστρέφει όλη τη γραμμή

select 
if (q1.home =1 and q1.away = 0,"1","2") as result
	from ( 	
		select points_home as home, points_away as away
		from football_score 
		where minute <=30
		limit 1) as q1

 

edit: τώρα που το σκέφτομαι, υπάρχει και ένα θέμα, πως θα αναπαραστήσω στον πίνακα τα παιχνίδια που ήριαν 0-0..

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

αν πριν το 30 έχουν μπει δέκα γκολ εναλλάξ ανάμεσα στις δύο ομάδες 

 

το query

    select points_home, points_away
        from football_score
        where minute <=30
        limit 1

θα σου γυρίσει την πρώτη ομάδα που έβαλε γκολ?

 

Επίσης βλέπω ελλειπες primary key. Αν πω φέρε μου την πρόοδο του αγώνα τάδε πως θα κάνεις την ανάκτηση ?

 

Στο θέμα σου θα χρσημοποιήσεις CASE

Δημοσ.

αν πριν το 30 έχουν μπει δέκα γκολ εναλλάξ ανάμεσα στις δύο ομάδες 

 

το query

    select points_home, points_away
        from football_score
        where minute <=30
        limit 1

θα σου γυρίσει την πρώτη ομάδα που έβαλε γκολ?

 

Επίσης βλέπω ελλειπες primary key. Αν πω φέρε μου την πρόοδο του αγώνα τάδε πως θα κάνεις την ανάκτηση ?

 

Στο θέμα σου θα χρσημοποιήσεις CASE

 

 

θα μου γυρισει το 1 γκολ, αλλα οχι μονο ποια ομαδα το εβαλε. Γι αυτο ψαχνω τον ελεγχο, ή μια παραλλαγη αυτου που εχω ηδη γραψει,

 

Τα ΡΚ τι προβλημα έχουν; Δεν τα όρισα βεβαια πουθενα για ευκολια, αλλα φαντασου πως ειναι μοναδικα auto increment.

τελικα αν δεχτω τον φορμaλισμο, τα παιχνιδια που έρθουν 0-0 αν το πίνακας είναι:

# idfootball_score, points_home, points_away, total_home, total_away, minute, period

1, 0, 0, 0, 0,0, 0

 

τότε το παρακάτω query μου επιστρεφει 1,2 ή 0 αναλογα με το home, away ή none.

select
if ( q1.home =1 and q1.away = 0 ,"1", if (q1.home =0 and q1.away =1,"2","0")) as result
    from (     
        select points_home as home, points_away as away
        from football_score
        where minute <=30
        limit 1) as q1

        
Δημοσ.

Ας πιασουμε το πρώτο θέμα τι θα σου επιστρέψει το query

 

Η MySQL θα φιλτράρει και θα φέρει και τα δέκα γκολ με το where clause που χρησιμοποιείς . Στη συνέχεια θα κάνει apply το limit για να κρατήσει μόνο το ένα γκολ . Αλλά ... σε καμία περίπτωση δεν σημαίνει ότι θα σου φέρει το πρώτο γκολ του αγώνα και όχι αυτό που πχ μπήκε στο 25 λεπτό. Μπορεί να σου παίξει φαινομενικά αλλά μπορεί αργότερα να έχεις απρόσμενα αποτελέσματα . Για να λυθεί αυτό πρέπει να κάνεις order by.

 

Πάμε τώρα για το κλειδί . Ο πίνακας κραταει αποτελέσματα ΠΟΛΛΩΝ αγώνων . Γράψε μου λοιπον το where clause για να μου φέρεις ολη την πρόοδο του αγώνα Ολυμπιακός - Παναθηναϊκός ( ας πούμε id 35 ) . Το οποίο πρέπει να επιστρέψει όπως καταλαβαίνεις πολλές εγγραφές όσα και τα γκολ που μπήκαν . Αλλά αφού λες ότι τα έχεις φτιάξει και δεν φαίνονται πάω πάσο.

Δημοσ.

Ας πιασουμε το πρώτο θέμα τι θα σου επιστρέψει το query

 

Η MySQL θα φιλτράρει και θα φέρει και τα δέκα γκολ με το where clause που χρησιμοποιείς . Στη συνέχεια θα κάνει apply το limit για να κρατήσει μόνο το ένα γκολ . Αλλά ... σε καμία περίπτωση δεν σημαίνει ότι θα σου φέρει το πρώτο γκολ του αγώνα και όχι αυτό που πχ μπήκε στο 25 λεπτό. Μπορεί να σου παίξει φαινομενικά αλλά μπορεί αργότερα να έχεις απρόσμενα αποτελέσματα . Για να λυθεί αυτό πρέπει να κάνεις order by.

 

Πάμε τώρα για το κλειδί . Ο πίνακας κραταει αποτελέσματα ΠΟΛΛΩΝ αγώνων . Γράψε μου λοιπον το where clause για να μου φέρεις ολη την πρόοδο του αγώνα Ολυμπιακός - Παναθηναϊκός ( ας πούμε id 35 ) . Το οποίο πρέπει να επιστρέψει όπως καταλαβαίνεις πολλές εγγραφές όσα και τα γκολ που μπήκαν . Αλλά αφού λες ότι τα έχεις φτιάξει και δεν φαίνονται πάω πάσο.

καλημερα φιλε, ευχαριστω για την απαντηση.

Ο καθε πινακας αφορα σε εναν αγωνα και ερχεται feed-αριστο το καθε γκολ, αρα τα γκολ ειναι με χρονολογικη σειρα, παρ'ολα αυτα εχεις απολυτο δικιο διοτι δεν ημουν σαφης. Όταν θέλησαν να δω ποια ομαδα θα φτασει πρωτη τα 3 πχ γκολέκανα αυτο που λες, αφου τσιμπησα τις εγραφες με τα 3 γκολ και διαλεξα την πρωτη σορταρωντας.

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

To rdbms δεν είναι guaranteed ότι θα στα γυρίσει με την σειρα εισαγωγής. Δεν είναι guaranteed ότι θα σου γυρίσει το πρώτο γκολ - την πρώτη εγγραφή που έκανες εισαγωγή . Αυτό προσπαθώ να σου πω.

Απλά στηρίζεσαι στο ότι το rdbms θα στα γυρίσει με την σειρα εισαγωγής

Επεξ/σία από Aztec
  • Like 2
Δημοσ.

To rdbms δεν είναι guaranteed ότι θα στα γυρίσει με την σειρα εισαγωγής. Δεν είναι guaranteed ότι θα σου γυρίσει το πρώτο γκολ - την πρώτη εγγραφή που έκανες εισαγωγή . Αυτό προσπαθώ να σου πω.

 

Απλά στηρίζεσαι στο ότι το rdbms θα στα γυρίσει με την σειρα εισαγωγής

ευχαριστω που το αποσαφίνισες. Δεν το είχα υποψιν. Πως γίνεται όμως, δεδομένου ότι και το id θα ανεβαίνει αυτόματα και θα είναι unique; Σε κάθε περιπτωση δλδ δεν πρεπει να εμπιστευομαι την σειρά που έχουν τα δεδομενα σε μια sql βαση, και πριν τρεξω τετοια querries θα πρεπει να σορτάρω αναλογα; Μιλαω γενικα, οχι μονο σε αυτη την περιπτωση.

 

Ευχαριστω

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

Απο την στιγμή που δεν υπάρχει,συμφωνα με το ANSI-SQL standard,συγκεκριμένος κανόνας για το πως πρέπει να επιστρεφόνται τα δεδομένα όταν δεν χρησιμοποιείται order by clause η υλοποίηση ειναι vendor specific. Αυτο σημαίνει ότι αλλιώς μπορεί να υλοποιείται η ανάκτηση σε Oracle,αλλιώς σε DB2,αλλιώς σε SQL server κτλ. Μάλιστα όσον αφορά την MySQL υπάρχει διαφορετική υλοποίηση σε MyISAM και INNODB engines.

 

Στην περίπτωση σου πραγματοποιείς query σε unindexed column. Αυτό θα οδηγήσει σε full table scan πραγματοποιώντας ανάκτηση στον δίσκο ή και στην cache ωστε να βρει δεδομένα. Και φυσικά θα τα φερει όπως τα βρει . Το πιο πιθανό στη περίπτωση σου είναι να τα φέρει όπως τα έβαλες. Δεν έχεις κάνει στην τελική κάποιo additional delete/update/insert στις εγγραφες

 

Αλλά η ερώτηση ειναι ... γιατι να παίξεις με το 0.00000001% ή να ασχοληθείς πως συμπεριφέρεται η κάθε engine και να μην πας με οτι λέει το ANSI-SQL standard?

Επεξ/σία από Aztec
  • Like 2

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

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

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

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

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

Σύνδεση

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

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