bahamut_zero Δημοσ. 1 Μαρτίου 2017 Δημοσ. 1 Μαρτίου 2017 (επεξεργασμένο) καλησπέρα, προσπαθώ να κάνω ένα απλό μαλλον ερώτημα, αλλά οι γνώσεις μου δεν με βοηθούν ακόμα. Καταρχήν με ενδιαφέρει να το τρέξω σε mysql, άρα μάλλον περιορίζομαι σε standard sql εντολες. Η βάση μου είναι η κλιμάκωση του σκορ σε έναν ποδοσφαιρικό αγώνα. έστω: # idfootball_score, points_home, points_away, total_home, total_away, minute, period1, 1, 0, 1, 0, 5, 12, 0, 1, 1, 1, 15, 13, 1, 0, 2, 1, 33, 14, 1, 0, 3, 1, 46, 15, 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.. Επεξ/σία 1 Μαρτίου 2017 από bahamut_zero
Aztec Δημοσ. 1 Μαρτίου 2017 Δημοσ. 1 Μαρτίου 2017 αν πριν το 30 έχουν μπει δέκα γκολ εναλλάξ ανάμεσα στις δύο ομάδες το query select points_home, points_away from football_score where minute <=30 limit 1 θα σου γυρίσει την πρώτη ομάδα που έβαλε γκολ? Επίσης βλέπω ελλειπες primary key. Αν πω φέρε μου την πρόοδο του αγώνα τάδε πως θα κάνεις την ανάκτηση ? Στο θέμα σου θα χρσημοποιήσεις CASE
bahamut_zero Δημοσ. 1 Μαρτίου 2017 Μέλος Δημοσ. 1 Μαρτίου 2017 αν πριν το 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
Aztec Δημοσ. 2 Μαρτίου 2017 Δημοσ. 2 Μαρτίου 2017 Ας πιασουμε το πρώτο θέμα τι θα σου επιστρέψει το query Η MySQL θα φιλτράρει και θα φέρει και τα δέκα γκολ με το where clause που χρησιμοποιείς . Στη συνέχεια θα κάνει apply το limit για να κρατήσει μόνο το ένα γκολ . Αλλά ... σε καμία περίπτωση δεν σημαίνει ότι θα σου φέρει το πρώτο γκολ του αγώνα και όχι αυτό που πχ μπήκε στο 25 λεπτό. Μπορεί να σου παίξει φαινομενικά αλλά μπορεί αργότερα να έχεις απρόσμενα αποτελέσματα . Για να λυθεί αυτό πρέπει να κάνεις order by. Πάμε τώρα για το κλειδί . Ο πίνακας κραταει αποτελέσματα ΠΟΛΛΩΝ αγώνων . Γράψε μου λοιπον το where clause για να μου φέρεις ολη την πρόοδο του αγώνα Ολυμπιακός - Παναθηναϊκός ( ας πούμε id 35 ) . Το οποίο πρέπει να επιστρέψει όπως καταλαβαίνεις πολλές εγγραφές όσα και τα γκολ που μπήκαν . Αλλά αφού λες ότι τα έχεις φτιάξει και δεν φαίνονται πάω πάσο.
bahamut_zero Δημοσ. 2 Μαρτίου 2017 Μέλος Δημοσ. 2 Μαρτίου 2017 Ας πιασουμε το πρώτο θέμα τι θα σου επιστρέψει το query Η MySQL θα φιλτράρει και θα φέρει και τα δέκα γκολ με το where clause που χρησιμοποιείς . Στη συνέχεια θα κάνει apply το limit για να κρατήσει μόνο το ένα γκολ . Αλλά ... σε καμία περίπτωση δεν σημαίνει ότι θα σου φέρει το πρώτο γκολ του αγώνα και όχι αυτό που πχ μπήκε στο 25 λεπτό. Μπορεί να σου παίξει φαινομενικά αλλά μπορεί αργότερα να έχεις απρόσμενα αποτελέσματα . Για να λυθεί αυτό πρέπει να κάνεις order by. Πάμε τώρα για το κλειδί . Ο πίνακας κραταει αποτελέσματα ΠΟΛΛΩΝ αγώνων . Γράψε μου λοιπον το where clause για να μου φέρεις ολη την πρόοδο του αγώνα Ολυμπιακός - Παναθηναϊκός ( ας πούμε id 35 ) . Το οποίο πρέπει να επιστρέψει όπως καταλαβαίνεις πολλές εγγραφές όσα και τα γκολ που μπήκαν . Αλλά αφού λες ότι τα έχεις φτιάξει και δεν φαίνονται πάω πάσο. καλημερα φιλε, ευχαριστω για την απαντηση. Ο καθε πινακας αφορα σε εναν αγωνα και ερχεται feed-αριστο το καθε γκολ, αρα τα γκολ ειναι με χρονολογικη σειρα, παρ'ολα αυτα εχεις απολυτο δικιο διοτι δεν ημουν σαφης. Όταν θέλησαν να δω ποια ομαδα θα φτασει πρωτη τα 3 πχ γκολέκανα αυτο που λες, αφου τσιμπησα τις εγραφες με τα 3 γκολ και διαλεξα την πρωτη σορταρωντας.
Aztec Δημοσ. 2 Μαρτίου 2017 Δημοσ. 2 Μαρτίου 2017 (επεξεργασμένο) To rdbms δεν είναι guaranteed ότι θα στα γυρίσει με την σειρα εισαγωγής. Δεν είναι guaranteed ότι θα σου γυρίσει το πρώτο γκολ - την πρώτη εγγραφή που έκανες εισαγωγή . Αυτό προσπαθώ να σου πω.Απλά στηρίζεσαι στο ότι το rdbms θα στα γυρίσει με την σειρα εισαγωγής Επεξ/σία 2 Μαρτίου 2017 από Aztec 2
bahamut_zero Δημοσ. 3 Μαρτίου 2017 Μέλος Δημοσ. 3 Μαρτίου 2017 To rdbms δεν είναι guaranteed ότι θα στα γυρίσει με την σειρα εισαγωγής. Δεν είναι guaranteed ότι θα σου γυρίσει το πρώτο γκολ - την πρώτη εγγραφή που έκανες εισαγωγή . Αυτό προσπαθώ να σου πω. Απλά στηρίζεσαι στο ότι το rdbms θα στα γυρίσει με την σειρα εισαγωγής ευχαριστω που το αποσαφίνισες. Δεν το είχα υποψιν. Πως γίνεται όμως, δεδομένου ότι και το id θα ανεβαίνει αυτόματα και θα είναι unique; Σε κάθε περιπτωση δλδ δεν πρεπει να εμπιστευομαι την σειρά που έχουν τα δεδομενα σε μια sql βαση, και πριν τρεξω τετοια querries θα πρεπει να σορτάρω αναλογα; Μιλαω γενικα, οχι μονο σε αυτη την περιπτωση. Ευχαριστω
Aztec Δημοσ. 3 Μαρτίου 2017 Δημοσ. 3 Μαρτίου 2017 (επεξεργασμένο) Απο την στιγμή που δεν υπάρχει,συμφωνα με το 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? Επεξ/σία 3 Μαρτίου 2017 από Aztec 2
Προτεινόμενες αναρτήσεις
Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε
Πρέπει να είστε μέλος για να αφήσετε σχόλιο
Δημιουργία λογαριασμού
Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!
Δημιουργία νέου λογαριασμούΣύνδεση
Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.
Συνδεθείτε τώρα