atrias Δημοσ. 3 Ιουνίου 2010 Δημοσ. 3 Ιουνίου 2010 Έχω 3 ή και περισσότερους πίνακες που αντιστοιχούν πχ ο καθένας σε ένα κατάστημα μιας αλυσίδας σε κάθε πίνακα υπάρχουν (μεταξύ άλλων) ένα πεδίο με ένα cust_id που αντιστοιχεί σε ένα πελάτη και ένα πεδίο spend που δείχνει πόσα έχει ξοδέψει ο συγκεκριμένος πελάτης για μια αγορά θέλω (σε MySQL) να ζητήσω να μου επιστραφούν όλα οι πελάτες (cust_id) που έχουν κάνει αγορές και πόσο έχει ξοδέψει (spend) ο καθένας σε όλα τα μαγαζιά μαζί! > A μαγαζί B μαγαζί Γ μαγαζί cust_id spend cust_id spend cust_id spend 5 10 7 4 5 12 4 6 4 2 3 7 3 5 9 2 6 2 3 6 για την παραπάνω περίπτωση η απάντηση θα πρέπει να είναι (η σειρά των γραμμών είναι φυσικά τυχαία) > cust_id spend_sum 5 22 4 8 3 18 7 4 9 2 6 2
bnvdarklord Δημοσ. 3 Ιουνίου 2010 Δημοσ. 3 Ιουνίου 2010 Αν και SQL ξεκίνησα να κάνω στην σχολή σε αυτό το εξάμηνο, νομίζω το να έχεις διαφορετικό πίνακα για κάθε μαγαζί δεν είναι καλή ιδεα... Μπορείς να έχεις εναν πίνακα με 3 χαρακτηριστικα cust_id, spend, store_id οπου στο store_id θα ειναι καποιο χαρακτηριστικό του καταστήματος... Νομίζω βοηθάει περισσότερο και στα ερωτήματα σου...
atrias Δημοσ. 3 Ιουνίου 2010 Μέλος Δημοσ. 3 Ιουνίου 2010 η δομή της βάσης είναι η δοσμένη και δεν γίνεται να αλλαχτεί οπότε ψάχνω να βρω το συγκεκριμένο query!
bnvdarklord Δημοσ. 3 Ιουνίου 2010 Δημοσ. 3 Ιουνίου 2010 Το θεμα είναι οτι αν δεν ξερεις απο πριν ποσα καταστήματα(αρα και πινακες) υπάρχουν δεν νομίζω να γινεται... Περίμενε να σου απαντήσει καποιος με περισσότερη εμπειρία απο μένα.
atrias Δημοσ. 3 Ιουνίου 2010 Μέλος Δημοσ. 3 Ιουνίου 2010 ο αριθμός των καταστημάτων είναι συγκεκριμένος και γνωστός δηλαδή στο παράδειγμα που έδωσα έχουμε αυτά τα 3 καταστήματα μόνο για το καθένα από τα οποία έχουμε ένα πίνακα
zinas Δημοσ. 3 Ιουνίου 2010 Δημοσ. 3 Ιουνίου 2010 http://dev.mysql.com/doc/refman/5.0/en/union.html http://dev.mysql.com/doc/refman/5.0/en/group-by-functions.html#function_sum Αυτά είναι αρκετά για να αρχίσεις. Ουσιαστικά πρέπει να κάνεις UNION όλους τους πίνακες και στο αποτέλεσμα να κάνεις SELECT-SUM-GROUP BY
atrias Δημοσ. 3 Ιουνίου 2010 Μέλος Δημοσ. 3 Ιουνίου 2010 select cust_id , spend from A UNION select cust_id , spend from B UNION select cust_id , spend from C ωραία μέχρι εδώ. μετά πως μπορώ να βάλω το αποτέλεσμα αυτού του ερωτήματος στο FROM του επόμενου που θα κάνει το sum - group by ? κάτι τέτοιου στυλ: SELECT cust_id , SUM (spend) FROM ( XXXX ) GROUP BY cust_id (όπου ΧΧΧ όλο το παραπάνω query με τα UNIONs) δε δούλεψε βγάζοντας syntax error στη MySQL
_tasos Δημοσ. 3 Ιουνίου 2010 Δημοσ. 3 Ιουνίου 2010 Αυτό που μπορείς να κάνεις είναι να φτιάξεις μία όψη (view). Το view αυτό θα είναι το SELECT query με τα UNION. Εφόσον έχεις φτιάξει το VIEW, τότε μπορείς να κάνεις group by στο view σαν να είναι πίνακας. > CREATE VIEW myView AS ( SELECT ... UNION SELECT ... UNION SELECT ... ) και μετά > SELECT ... FROM myView GROUP BY ....
atrias Δημοσ. 3 Ιουνίου 2010 Μέλος Δημοσ. 3 Ιουνίου 2010 πολύ καλή ιδέα αυτή με το VIEW και να πω την αλήθεια μου πέρασε από το μυαλό αλλά επειδή δεν τα έχω συνηθίσει ήθελα να το αποφύγω. οπότε θα χρειαστούμε δύο queries για να πετύχουμε αυτό που θέλουμε. μια απορία σχετικά με τα VIEWs κάνω αρχικά create το view αυτό "μένει" στη MySQL για πάντα μέχρι να το κάνω drop σωστά? κι επίσης αν αλλάζουν τα δεδομένα στους πίνακες A B C τότε αλλάζουν και τα περιεχόμενα από το VIEW ? δηλαδή το φτιάχνω μια φορά και από κει και πέρα τρέχω μόνο το δεύτερο query στην εφαρμογή μου? και τέλος στο phpMyAdmin πως βλέπω τι views υπάρχουν φτιαγμένα στη βάση? απότι φαίνεται λοιπόν για να χρησιμοποιηθεί το αποτέλεσμα του πρώτου query στο FROM του δεύτερου query τα views πρέπει να είναι η μόνη λύση σωστά? Αν υπάρχει κάτι άλλο που θα μπορούσε να γίνει σε αυτό το σημείο αν ξέρει κανείς να μας πει θα ήταν πολύ χρήσιμο! σωστή και η παρατήρηση για το UNION ALL ώστε να συμπεριληφθούν και τα duplicates! σας ευχαριστώ πολύ όλους για τη βοήθεια!
Aztec Δημοσ. 3 Ιουνίου 2010 Δημοσ. 3 Ιουνίου 2010 Δεν χρειάζεται το VIEW θα το κανεις με τον πρώτο τρόπο που είπες Δηλαδη SELECT A.CUST_ID, SUM(A.SPEND)FROM (XXXXXXXXXXXXXXXXXX) A GROUP BY A.CUST_ID Αλλά μην ξεχάσεις το alias. Δηλαδή το A που έχω βάλει
_tasos Δημοσ. 3 Ιουνίου 2010 Δημοσ. 3 Ιουνίου 2010 Ναι, στην ουσία το view είναι σαν πίνακας. Τον ορίζεις μία φορά κ μετά έχει την ίδια συμπεριφορά με έναν πίνακα. Όχι όμως για insert, update, delete!!. Από την στιγμή που την έχεις ορίσει, μπορείς να κάνεις ότι θέλεις με SELECT, π.χ. GROUP BY, JOIN, JOIN με άλλες views, κτλ. Η απάντηση του φίλου Aztec είναι επίσης σωστή. Και δεν χρειάζεσαι το view. Αλλά αν θέλεις να έχεις πιο μαζεμένο κώδικα, φτιάξε την. Το αποτέλεσμα που θα έχεις θα είναι το ίδιο.
atrias Δημοσ. 3 Ιουνίου 2010 Μέλος Δημοσ. 3 Ιουνίου 2010 Δεν χρειάζεται το VIEW θα το κανεις με τον πρώτο τρόπο που είπες Αλλά μην ξεχάσεις το alias. Δηλαδή το A που έχω βάλει Αρχικά με αυτόν τον τρόπο το είχα δοκιμάσει αλλά δεν δούλεψε alias όμως δεν είχα βάλει. Παίζει να έφταιγε αυτό? το είχα ακριβώς όπως το έγραψα παραπάνω δηλαδή SELECT cust_id , SUM (spend) FROM ( XXXX ) GROUP BY cust_id Ναι, στην ουσία το view είναι σαν πίνακας. Τον ορίζεις μία φορά κ μετά έχει την ίδια συμπεριφορά με έναν πίνακα. Όχι όμως για insert, update, delete!!. Από την στιγμή που την έχεις ορίσει, μπορείς να κάνεις ότι θέλεις με SELECT, π.χ. GROUP BY, JOIN, JOIN με άλλες views, κτλ θαυμάσια! και όταν προσθέσω κάτι στον πίνακα Α πχ τότε μπαίνει αυτόματα και στο VIEW αυτό που έχουμε έτσι? δηλαδή είναι δυναμικό το view κι όχι ένα στατικό στιγμιότυπο των πινάκων όπως ήταν τη στιγμή που έκανα το create view σωστά?
Aztec Δημοσ. 3 Ιουνίου 2010 Δημοσ. 3 Ιουνίου 2010 Αν δεν δηλώσεις alias θα βγάλει error Every derived table must have its own alias Έχεις δίκιο για το VIEW. Κάθε φορά που το καλείς έχεις τα τελευταία data απο το query που το ορίζει.
Προτεινόμενες αναρτήσεις
Αρχειοθετημένο
Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.