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

SQL - ερώτημα για πολλούς πίνακες


atrias

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

Δημοσ.

Έχω 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

Δημοσ.

Αν και SQL ξεκίνησα να κάνω στην σχολή σε αυτό το εξάμηνο, νομίζω το να έχεις διαφορετικό πίνακα για κάθε μαγαζί δεν είναι καλή ιδεα...

 

Μπορείς να έχεις εναν πίνακα με 3 χαρακτηριστικα cust_id, spend, store_id οπου στο store_id θα ειναι καποιο χαρακτηριστικό του καταστήματος...

Νομίζω βοηθάει περισσότερο και στα ερωτήματα σου...

Δημοσ.

η δομή της βάσης είναι η δοσμένη και δεν γίνεται να αλλαχτεί οπότε ψάχνω να βρω το συγκεκριμένο query!

Δημοσ.

Το θεμα είναι οτι αν δεν ξερεις απο πριν ποσα καταστήματα(αρα και πινακες) υπάρχουν δεν νομίζω να γινεται...

Περίμενε να σου απαντήσει καποιος με περισσότερη εμπειρία απο μένα.

Δημοσ.

ο αριθμός των καταστημάτων είναι συγκεκριμένος και γνωστός

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

Δημοσ.

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

Δημοσ.

Αυτό που μπορείς να κάνεις είναι να φτιάξεις μία όψη (view). Το view αυτό θα είναι το SELECT query με τα UNION.

 

Εφόσον έχεις φτιάξει το VIEW, τότε μπορείς να κάνεις group by στο view σαν να είναι πίνακας.

 

>
CREATE VIEW myView AS 
(
SELECT ...
UNION
SELECT ...
UNION
SELECT ...
)

 

και μετά

>
SELECT ...
FROM myView
GROUP BY ....

Δημοσ.

πολύ καλή ιδέα αυτή με το VIEW και να πω την αλήθεια μου πέρασε από το μυαλό αλλά επειδή δεν τα έχω συνηθίσει ήθελα να το αποφύγω.

 

οπότε θα χρειαστούμε δύο queries για να πετύχουμε αυτό που θέλουμε.

μια απορία σχετικά με τα VIEWs

κάνω αρχικά create το view

αυτό "μένει" στη MySQL για πάντα μέχρι να το κάνω drop σωστά?

κι επίσης αν αλλάζουν τα δεδομένα στους πίνακες A B C τότε αλλάζουν και τα περιεχόμενα από το VIEW ?

δηλαδή το φτιάχνω μια φορά και από κει και πέρα τρέχω μόνο το δεύτερο query στην εφαρμογή μου?

και τέλος στο phpMyAdmin πως βλέπω τι views υπάρχουν φτιαγμένα στη βάση?

 

απότι φαίνεται λοιπόν για να χρησιμοποιηθεί το αποτέλεσμα του πρώτου query στο FROM του δεύτερου query τα views πρέπει να είναι η μόνη λύση σωστά?

Αν υπάρχει κάτι άλλο που θα μπορούσε να γίνει σε αυτό το σημείο αν ξέρει κανείς να μας πει θα ήταν πολύ χρήσιμο!

 

σωστή και η παρατήρηση για το UNION ALL ώστε να συμπεριληφθούν και τα duplicates!

 

σας ευχαριστώ πολύ όλους για τη βοήθεια!

Δημοσ.

Δεν χρειάζεται το VIEW θα το κανεις με τον πρώτο τρόπο που είπες

 

Δηλαδη

SELECT A.CUST_ID, SUM(A.SPEND)

FROM (XXXXXXXXXXXXXXXXXX) A

GROUP BY A.CUST_ID

 

Αλλά μην ξεχάσεις το alias. Δηλαδή το A που έχω βάλει

Δημοσ.

Ναι, στην ουσία το view είναι σαν πίνακας. Τον ορίζεις μία φορά κ μετά έχει την ίδια συμπεριφορά με έναν πίνακα. Όχι όμως για insert, update, delete!!. Από την στιγμή που την έχεις ορίσει, μπορείς να κάνεις ότι θέλεις με SELECT, π.χ. GROUP BY, JOIN, JOIN με άλλες views, κτλ.

 

Η απάντηση του φίλου Aztec είναι επίσης σωστή. Και δεν χρειάζεσαι το view. Αλλά αν θέλεις να έχεις πιο μαζεμένο κώδικα, φτιάξε την. Το αποτέλεσμα που θα έχεις θα είναι το ίδιο.

Δημοσ.
Δεν χρειάζεται το 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 σωστά?

Δημοσ.

Αν δεν δηλώσεις alias θα βγάλει error

 

Every derived table must have its own alias

 

Έχεις δίκιο για το VIEW. Κάθε φορά που το καλείς έχεις τα τελευταία data απο το query που το ορίζει.

Αρχειοθετημένο

Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.

  • Δημιουργία νέου...