basilis5 Δημοσ. 18 Οκτωβρίου 2016 Δημοσ. 18 Οκτωβρίου 2016 Καλησπέρα, έχω το εξής πρόβλημα σε ένα query, που προσπαθώ να τρέξω στην sql (χρησιμοποιω mysql). Χρησιμοποιώντας inner join καταλήγω σε έναν πίνακα, ο οποίος αριστερά έχει κάποιες πολιτείες και δεξιά κάποιους κωδικούς. Αυτό που θέλω είναι για κάθε πολιτεία να βρω τον top κωδικό ( με την μεγαλύτερη συχνότητα δηλαδή). Νομίζω δεν έχει αξία να σας μπερδέψω με τους αρχικούς μου πίνακες, οπότε σας δείχνω το query που περιέχει το join. select location_table.locationADDR_state as "Rental's State (pickup)",car_table.categoryID FROM rental_table JOIN location_table ON rental_table.rental_pickup_location = location_table.locationID JOIN car_table ON car_table.carID = rental_table.carID; το οποίο που επιστρέφει τον ακόλουθο πίνακα. Attica 2 MA 1 Lazio 2 Attica 1 NY 1 Thessaloniki 2 MA 1 Thessaloniki 1 Thessaloniki 6 Thessaloniki 6 Αυτό που θέλω ουσιαστικά είναι να πάρω Attica 1 Attica 2 /* εδω δεν ξερω αν γινεται να παρω και τις 2 τιμες, όταν έχουν την ίδια συχνότητα */ MA 1 Lazio 2 NY 1 Thessaloniki 6 Γράφω το παρακάτω αλλά δεν δουλεύει: select location_table.locationADDR_state as "Rental's State (pickup)",car_table.categoryID FROM rental_table JOIN location_table ON rental_table.rental_pickup_location = location_table.locationID JOIN car_table ON car_table.carID = rental_table.carID group by location_table.locationADDR_state order by count(car_table.categoryID) desc; επιστρέφει αυτο: Thessaloniki 2 Attica 2 MA 1 Lazio 2 NY 1 το παράδειγμα μου με τις τιμές είναι κακό, αλλά στην Θεσσαλονίκη θα έπρεπε να φέρει 6 (που έχει συχνότητα 2). Μπορεί κάποιος να με βοηθήσει, να σκεφτεί τι κάνω λάθος; Το σκεπτικό μου ήταν με την group by να ομαδοποιήσω τις πολιτείες, και με το order by να βρω σε φθήνουσα σειρά τον τοπ σε πληθος (count) κωδικό. Ευχαριστώ
denis_kos Δημοσ. 18 Οκτωβρίου 2016 Δημοσ. 18 Οκτωβρίου 2016 Δεν έχω καταλάβει σε αυτό που έχεις ως επιθυμητή έξοδο, με ποιο κριτήριο θες να σου διαφοροποιήσει την αττική αλλά να ομαδοποιήσει την Θεσσαλονίκη. Εννοώ υπάρχει κάποιο πεδίο που είναι διαφορετικό? Θέλω να πώ αν κάνεις groyp by locationADDR_state γτ η αττική να τυπώνεται δύο φορές?
basilis5 Δημοσ. 18 Οκτωβρίου 2016 Μέλος Δημοσ. 18 Οκτωβρίου 2016 Δεν έχω καταλάβει σε αυτό που έχεις ως επιθυμητή έξοδο, με ποιο κριτήριο θες να σου διαφοροποιήσει την αττική αλλά να ομαδοποιήσει την Θεσσαλονίκη. Εννοώ υπάρχει κάποιο πεδίο που είναι διαφορετικό? Θέλω να πώ αν κάνεις groyp by locationADDR_state γτ η αττική να τυπώνεται δύο φορές? Ευχαριστω για την απαντηση. Δεν ξερω αν πρεπει να την διαφοροποιει, το ανεφερα απλα επειδη υπαρχει μια αττικη με κωδικο 1, και αλλη μια με κωδικο 2, και δεν ειναι ξεκαθαρο ποια θα επρεπε να επιστρεφει. Αν ομως ειχε ας πουμε δυο φορες αττικη με κωδικο 2, και μια με κωδικο 1, κ επρεπε να επιστρεψει 2, εχεις καμια ιδεα;
denis_kos Δημοσ. 18 Οκτωβρίου 2016 Δημοσ. 18 Οκτωβρίου 2016 Λοιπον, εφόσσον υπάρχουν 2 αττικές(διαφορετικοί κωδικοι), δες αν μπορείς να κάνεις το group by με κάποιο άλλο πεδιο π έχουν διαφορετικό (π.χ. Id). Επίσης εκτιμώ,αν κάνεις το Order πριν το group θα λύσει το πρόβλημα σου με το λάθος (Που έπρεπε να βγάζει 6). Αλλίως πρέπει να βάλεις το Max() στο αρχικό select.
anon667 Δημοσ. 18 Οκτωβρίου 2016 Δημοσ. 18 Οκτωβρίου 2016 Λογικά με column που κάνει select θα είσαι ΟΚ, αλλά δεν γνωρίζω αν το υποστηρίζει η MySQL (π.χ. SQL Server και Oracle δεν έχουν θέμα).π.χ. κάτι της μορφής SELECT lt.locationADDR_state, (SELECT TOP 1 ct.categoryID FROM rental_table rt INNER JOIN location_table lt2 ON lt2.locationID = rt.rental_pickup_location INNER JOIN car_table ct ON ct.carID = rt.carID WHERE lt2.locationADDR_state = lt.locationADDR_state GROUP BY lt2.locationADDR_state, ct.categoryID ORDER BY COUNT(ct.categoryID) DESC ) FROM location_table lt Δηλαδή για κάθε περιοχή, θα κάνεις ένα sub-select που θα βγάζεις την λίστα με την συχνότητα για αυτή την περιοχή και θα διαλέγεις το top 1 από τα DESC αποτελέσματα.Πιστεύω καταλαβαίνεις την λογική. Hope it helps.PS: Το group by/order by ίσως θέλει κάποιες μικροαλλαγές, but that's life without a testing environment. 1
basilis5 Δημοσ. 18 Οκτωβρίου 2016 Μέλος Δημοσ. 18 Οκτωβρίου 2016 Λογικά με column που κάνει select θα είσαι ΟΚ, αλλά δεν γνωρίζω αν το υποστηρίζει η MySQL (π.χ. SQL Server και Oracle δεν έχουν θέμα). π.χ. κάτι της μορφής SELECT lt.locationADDR_state, (SELECT TOP 1 ct.categoryID FROM rental_table rt INNER JOIN location_table lt2 ON lt2.locationID = rt.rental_pickup_location INNER JOIN car_table ct ON ct.carID = rt.carID WHERE lt2.locationADDR_state = lt.locationADDR_state GROUP BY lt2.locationADDR_state, ct.categoryID ORDER BY COUNT(ct.categoryID) DESC ) FROM location_table lt Δηλαδή για κάθε περιοχή, θα κάνεις ένα sub-select που θα βγάζεις την λίστα με την συχνότητα για αυτή την περιοχή και θα διαλέγεις το top 1 από τα DESC αποτελέσματα. Πιστεύω καταλαβαίνεις την λογική. Hope it helps. PS: Το group by/order by ίσως θέλει κάποιες μικροαλλαγές, but that's life without a testing environment. είναι σίγουρα σε καλύτερο δρόμο από το δικό μου, σε ευχαριστώ πολύ! Ερώτηση, στον πίνακα location_table δίνεις 2 συντομεύσεις, ltκαι lt2 τις οποίες στην where εξισώνεις. Αυτό γιατί έγινε; Έχει να κάνει με το κόκκινο που είπες στην παράθεση;
anon667 Δημοσ. 18 Οκτωβρίου 2016 Δημοσ. 18 Οκτωβρίου 2016 Ναι, στην ουσία χρησιμοποιείς σαν φίλτρο στην εσωτερική select την τιμή που έρχεται από την εξωτερική. 1
basilis5 Δημοσ. 18 Οκτωβρίου 2016 Μέλος Δημοσ. 18 Οκτωβρίου 2016 δυστυχώς ειμαι πολυ noob ακομα για να το κατανοήσω πληρως Αυτο που εχεις γραψει, φερνει σωστα τις τιμες για τις πολιτειες, όμως παραλληλα φέρνει και πολιτειες που δεν θα επρεπε (δεν ανηκουν στην τομη των 3 πινακων) Attica 2 Thessaloniki 6 MA 1 NY 1 Leicestershire Null London Null Lazio 2 Toscana Null
anon667 Δημοσ. 18 Οκτωβρίου 2016 Δημοσ. 18 Οκτωβρίου 2016 Ο πιο απλός τρόπος (θεωρητικά) θα ήταν να δώσεις όνομα στο column της sub-select και να βάλεις WHERE που να τσεκάρεις αν η στήλη αυτή εχει null. Αν δεν παίζει απ'ευθείας, θα χρειαστεί να κάνεις το query σου στην μορφή select COL_1, COL_2 FROM ( <-- τα ονόματα που έχεις δώσει στις στήλες στο query σου <Εδώ το κανονικό σου query> ) zzz WHERE zzz.COL_2 IS NOT NULL ή κάτι αντίστοιχο. Δεν γνωρίζω ιδιαιτερότητες MySQL δυστυχώς. Edit: Αυτό με τα rows που έχουν null συμβαίνει επειδή επεξεργάζεσαι όλες τις εγγραφές από το table με τα locations, μιας και δεν γίνεται κάποιο φιλτράρισμα για να έχεις μόνο τις εγγραφές που έχουν τουλάχιστον ένα rented car. 1
Tmark Δημοσ. 18 Οκτωβρίου 2016 Δημοσ. 18 Οκτωβρίου 2016 είναι σίγουρα σε καλύτερο δρόμο από το δικό μου, σε ευχαριστώ πολύ! Ερώτηση, στον πίνακα location_table δίνεις 2 συντομεύσεις, ltκαι lt2 τις οποίες στην where εξισώνεις. Αυτό γιατί έγινε; Έχει να κάνει με το κόκκινο που είπες στην παράθεση; Αυτό λέγεται alias, το οποίο σε βοηθάει να χειρίζεσαι πιο εύκολα πίνακες και στήλες στα διάφορα clauses και joins, ώστε να μην γράφεις κάθε φορά ολόκληρο το όνομα. 1
denis_kos Δημοσ. 18 Οκτωβρίου 2016 Δημοσ. 18 Οκτωβρίου 2016 Επίσης μπορείς να εμφανίσεις αυτα που έχουν count >0 .
basilis5 Δημοσ. 20 Οκτωβρίου 2016 Μέλος Δημοσ. 20 Οκτωβρίου 2016 σας ευχαριστω για τις απαντησεις. Να κανω αλλη μια ερωτηση follow up, μηπως γνωρίζετε. Θέλω να φτιαξω εναν πινακα που θα εχει 3 στειλες με καποια συγκεκριμενα χαρακτηριστικα. Αυτο που εχω καταφερει ειναι να φτιαξω 3 ξεχωριστα queries τα οποια μου δινουν 1η στηλη μηνες, και 2η στηλη το καθενα καποιες συγκεκριμενες τιμες. Εγω θελω ομως να τα τρεξω και τα τρια μαζι, ετσι ωστε να προκυψει ενας πινακας στο τελος, μηνες, και 3 στηλες. πως μπορω να το κανω; Αν έχει αξία τα queries μου ειναι τα παρακατω, ενω επισυναπτω και το τι επιστρεφει καθενα: # 1 stili SELECT month(rdate), (SELECT SUM(ramaount) FROM my_table WHERE (month(rdate) <(month(a.rdate))) and year(rdate)=2015 ) as total_previous FROM my_table a where year(rdate)=2015 group by month(rdate) order by year(rdate),month(rdate); # 2 stili select month(rdate) as month_2015, sum(ramaount) from my_table where year(rdate) in (2015) group by month(rdate); # 3h stili SELECT month(rdate), (SELECT SUM(ramaount) FROM my_table WHERE (month(rdate) >(month(a.rdate))) and year(rdate)=2015 ) as total_next FROM my_table a where year(rdate)=2015 group by month(rdate) order by year(rdate),month(rdate); 1η στηλη 1, 3, 375 5, 1325 6, 3055 7, 4255 8, 10255 9, 10555 10, 10755 12, 10935 2η στηλη 1, 375 3, 950 5, 1730 6, 1200 7, 6000 8, 300 9, 200 10, 180 12, 1200 3η στηλη '1, 11760 3, 10810 5, 9080 6, 7880 7, 1880 8, 1580 9, 1380 10, 1200 12,
Προτεινόμενες αναρτήσεις
Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε
Πρέπει να είστε μέλος για να αφήσετε σχόλιο
Δημιουργία λογαριασμού
Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!
Δημιουργία νέου λογαριασμούΣύνδεση
Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.
Συνδεθείτε τώρα