'Ασκηση στην SQL

Συζητήσεις για την βάση δεδομένων MySQL και το phpMyAdmin

Συντονιστές: WebDev Moderators, Super-Moderators

Απάντηση
Manousos
Δημοσιεύσεις: 10
Εγγραφή: 16 Δεκ 2009 02:16

'Ασκηση στην SQL

Δημοσίευση από Manousos » 16 Δεκ 2009 02:30

Γεια σε όλους, έχω μια άσκηση με SQL και έχω κολλήσει σε 2 ερωτήσεις και θα ήθελα λιγη βοήθεια!!
έχουμε τους παρακάτω πίνακες:

MOVIE (Movie_id,Title, Type, Year, Producer)
CLIENT (client_id, Name, Address, City)
RENT (Rental_id, Date, Movie_id, Client-id, Cost)

και δεν μπορώ να σκεφτώ πως να απαντήσω τα εξής:

1.Βρείτε την πιο δημοφιλή (δηλαδή με τις περισσότερες ενοικιάσεις) ταινία παραγωγής 2005 έως 2008
2. Βρείτε το μέσο αριθμό ενοικιάσεων ανά πελάτη...

Μήπως μπορεί να βοηθείση καποιος???

Άβαταρ μέλους
dimsis
Reporter
Δημοσιεύσεις: 7994
Εγγραφή: 25 Ιούλ 2001 03:00

'Ασκηση στην SQL

Δημοσίευση από dimsis » 16 Δεκ 2009 08:20

Γράψε μας τι έχεις κάνει μέχρι τώρα να δούμε σε πιο σημείο μπορούμε να βοηθήσουμε.
Και ρίξε μια ματιά και εδώ: http://www.freestuff.gr/forums/viewtopic.php?t=46323

Manousos
Δημοσιεύσεις: 10
Εγγραφή: 16 Δεκ 2009 02:16

'Ασκηση στην SQL

Δημοσίευση από Manousos » 16 Δεκ 2009 09:42

Σκοπός της άσκησης μου ειναι η εξάσκηση στην δημιουργία μιας βασης δεδομένων και η απάντηση ερωτήσεων (query).
ξεκινώντας δημιούργησα τους 3ης πίνακες MOVIE (key = movie_id) , CLIENT (key= client_id) , RENT(key = rental_id)
και στην συνεχεια τους γέμισα με διαφορες τυχαίες πλειάδες δηλ. έβαλα πέλατες, έβαλα διάφορες ταίνιες και στην συνέχεια κάποιες ενοικιάσεις!! (ολες οι παραπάνω προσθήκες έγιναν με σκοπο να υπάρχουν απαντήσεις στα query).

Τα query που πρέπει να απαντήσω είναι τα εξής:

a. Βρείτε τα ονόματα των πελατών που νοικιάζουν όλες τις ταινίες που παράγει η "MGM" από το 2000 και μετά.
b. Βρείτε τα ονόματα και τις διευθύνσεις των πελατών οι οποίοι νοικιάζουν ταινίες τύπου "Action".
c. Βρείτε τις πόλεις στις οποίες μένουν πελάτες οι οποίοι δεν νοικιάζουν καμία ταινία με ημερομηνία παραγωγής νωρίτερα από το 1995.
d. Βρείτε τους τίτλους των ταινιών που νοικιάζονται με κόστος μεγαλύτερο από 5 ευρώ από πελάτες που βρίσκονται στην Αθήνα
e. Βρείτε τα ζεύγη πελατών – παραγωγών ταινιών τα οποία είναι τέτοια ώστε ο πελάτης να μην νοικιάζει καμία ταινία του παραγωγού.
f. Βρείτε την πιο δημοφιλή (δηλαδή με τις περισσότερες ενοικιάσεις) ταινία παραγωγής 2005 έως 2008
g. Βρείτε το μέσο αριθμό ενοικιάσεων ανά πελάτη

Στα 5 πρώτα είμαι οκ... τα προβλήματα μου ξεκίνανε στα 2 τελυταία!!!

για το 6 έχω βρει ποιες ταινίες έχουν νοικιαστει χρεισιμοποιώντας το εξής:
SELECT movie_id , count(*)
FROM rent
GROUP BY movie_id;
αλλα τώρα πως θα πάρω την πιο δημοφιλη η πως θα ζητήσω να μου βγάλει μονο τις παραγωγές 2005-2008 χάνομαι... :(
επισης για το 7 προσπαθησα να το κανω με ενα είδος διαίρεσης :
SELECT count(rental_id.a)/count(client_id.b)
from rent a , client b;
αλλα μου βαζει error!! :(

Ειμαι αρκετά νεος στην SQL και ίσως αυτο που ψάχνω να ειναι πολυ εύκολο αλλα έχω κολλήσει....
Καθε βοήθεια θα είναι δέκτη... έστω και καποιο βοήθημα που μπορεί να μην βρήκα ψάχνοντας στο ιντερνετ...

Άβαταρ μέλους
dva_dev
Script Master
Δημοσιεύσεις: 3790
Εγγραφή: 16 Σεπ 2005 01:32
Επικοινωνία:

'Ασκηση στην SQL

Δημοσίευση από dva_dev » 16 Δεκ 2009 09:57

http://anemos.web.auth.gr/database/%CE% ... %20sql.pdf

Αυτά που χρειάζεσαι είναι να συνδιάσεις το count με το order by fieldname/alias. Για τα υπόλοιπα υπάρχουν αντίστοιχες functions με την count, π.χ. avg για μέσο όρο.
Για να φέρεις στοιχεία από 2+ πίνακες πρέπει με κάποιο τρόπο να συνδέσεις τους πίνακες αυτούς με πεδία που έχουν κοινά στοιχεία (ο ένας πίνακας έχει κάποιο/α πεδίο/α που δείχνουν σε στοιχεία κάποιου άλλου). Δες τα left/right/inner joins.

Manousos
Δημοσιεύσεις: 10
Εγγραφή: 16 Δεκ 2009 02:16

'Ασκηση στην SQL

Δημοσίευση από Manousos » 16 Δεκ 2009 10:24

dva_dev ευχαριστώ πολυ, μολις εβγαλα το ενα απο τα 2 (f)...
μενει αλλο ενα!!! δεν το εχω προσπαθήσει ακόμα αλλα ενθουσιάστικα με το πρώτο και ήθελα να σε ευχαριστίσω!!! Καλή σου μέρα!!

Άβαταρ μέλους
dimsis
Reporter
Δημοσιεύσεις: 7994
Εγγραφή: 25 Ιούλ 2001 03:00

'Ασκηση στην SQL

Δημοσίευση από dimsis » 16 Δεκ 2009 11:04

Όταν θέλεις να ψάξεις σε συγκεκριμένα χρονικά διαστήματα μπορείς είτε να χρησιμοποιείς την between
στο στυλ select tade from deina where mydate BETWEEN '1/1/2005' AND '31/12/2008'
ή με > και < αντί για between...

Άβαταρ μέλους
burnmind
Script Master
Δημοσιεύσεις: 954
Εγγραφή: 26 Σεπ 2009 02:14
Τοποθεσία: UK
Επικοινωνία:

'Ασκηση στην SQL

Δημοσίευση από burnmind » 16 Δεκ 2009 14:59

dimsis έγραψε:Όταν θέλεις να ψάξεις σε συγκεκριμένα χρονικά διαστήματα μπορείς είτε να χρησιμοποιείς την between
στο στυλ select tade from deina where mydate BETWEEN '1/1/2005' AND '31/12/2008'
ή με > και < αντί για between...
Σωστά, απλά νομίζω πως η MySQL χειρίζεται τις ημερομηνίες στην εξής μορφή: YYYY-MM-DD.

Άβαταρ μέλους
dva_dev
Script Master
Δημοσιεύσεις: 3790
Εγγραφή: 16 Σεπ 2005 01:32
Επικοινωνία:

'Ασκηση στην SQL

Δημοσίευση από dva_dev » 16 Δεκ 2009 16:50

και ακόμα καλύτερα να χρησιμοποιείς την STR_TO_DATE (και βάζεις το string της ημερομηνίας σε ότι μορφή θέλεις), παρά να την αφήνεις να προσπαθήσει να κάνει convert το string μόνη της.

Manousos
Δημοσιεύσεις: 10
Εγγραφή: 16 Δεκ 2009 02:16

'Ασκηση στην SQL

Δημοσίευση από Manousos » 16 Δεκ 2009 22:30

Τελικά ΟΚ με το F αλλά το τελευταιο ερωτημα δεν βγαίνει!!
Προσπαθώ κανοντα count ωστε να μετρισω ποσες ενοιικιασεις εχουν γεινει, επισης count για να βρω ποσους πελατες εχω αλλα μετα... σκοπος ειναι να μπορουσα να διαιρεσω αυτα τα νουμερα!! αλλα πως??
ΚΑΜΙΑ ΙΔΕΑ...????

Manousos
Δημοσιεύσεις: 10
Εγγραφή: 16 Δεκ 2009 02:16

'Ασκηση στην SQL

Δημοσίευση από Manousos » 17 Δεκ 2009 01:52

Sorry για τις συνεχόμενες ερωτοαπαντήσεις αλλα ασχολούμε σχεδόν ολη μερα με αυτο και ολο κατι βρίσκω και κατι χάνω!! Αλλα OK ειμαι κοντά στο τέλος... Είναι ολα λυμένα τώρα απλα έχω κανει ενα λαθος, που δεν μπορώ να βρω λύση!! λοιπον στην ερώτηση:

Βρείτε τα ονόματα των πελατών που νοικιάζουν όλες τις ταινίες που παράγει η "MGM" από το 2000 και μετά.
απαντάω ως εξης:

SELECT name_id FROM client
WHERE client_id IN
(SELECT client_id FROM rent WHERE movie_id IN
(SELECT movie_id FROM movie WHERE
producer = 'MGM' AND year >2000));

το προβλημα είναι ότι αυτό βγάζει τα ονόματα των πελατών που εχουν ενοικιάσει έστω και μια ταινια απο την MGM παραγωγείς μετα το 2000 και όχι ΟΛΕΣ που είναι το ζητούμενο!!! :(

ΚΑΜΙΑ ΙΔΕΑ;;;;;; :hammer:

migi
Δημοσιεύσεις: 2
Εγγραφή: 17 Δεκ 2009 02:05

'Ασκηση στην SQL

Δημοσίευση από migi » 17 Δεκ 2009 02:11

Γεια και από μένα.

Έχω κι εγώ απορία σχετικά με αυτή την άσκηση. Στο ερώτημα e) πως μπορούμε να βρούμε τα ζέυγη πελατών-παραγωγών ταινιών. Έχω προσπαθήσει με διάφορους τρόπους αλλά δεν έχω καταφέρει τιποτα. Τα υπόλοιπα ερωτήμαρα είναι ok.

Ευχαριστώ εκ των προτέρων

Manousos
Δημοσιεύσεις: 10
Εγγραφή: 16 Δεκ 2009 02:16

'Ασκηση στην SQL

Δημοσίευση από Manousos » 17 Δεκ 2009 10:15

Migi η ιδέα στο (e) είναι:

επιλέγης ολα τα ζεύγη πελατων - παραγωγών (1)... στην συνέχεια επιλέγεις ολα τα ζεύγη πελατών - παραγωγών που εχουν νοικιασει ταινιες παιρνοντας την πληροφορία απο το rent (2)!! και κανεις (1) not in (2) !!!

προσπάθησε και αν δεν το βρεις πες να σου δώσω την απάντηση!!!

καμία βοήθεια για το τι λάθος κάνω στην (a)?????? :roll:

migi
Δημοσιεύσεις: 2
Εγγραφή: 17 Δεκ 2009 02:05

'Ασκηση στην SQL

Δημοσίευση από migi » 17 Δεκ 2009 15:36

Λοιπόν στο πρώτο ερώτημα, έχουμε να κάνουμε διαίρεση. Από ότι είδα στις διαλέξεις του μαθήματος, θα πρέπει να μετατρέψεις την πρόταση σου σε 2 αρνήσεις. Δηλαδή:


η πρόταση μας λεεί: "Βρείτε τα ονόματα των πελατών που νοικιάζουν όλες τις ταινίες που παράγει η "MGM" από το 2000 και μετά"

Οπότε μετασχηματίζοντάς τη σε 2 αρνήσεις έχουμε:

"Να βρόυμε τα ονόματα των πελατών για τους οποίους δεν υπάρχει ταινία που έχουν νοικιάσει , η οποία δεν έχει παράγει η MGM από το 2000 και μετά"


Μετά στο παράδειγμα που έχει μετατρέποντας την σε sql υλοποιεί πρώτα την δεύτερη άρνηση και μετά την πρώτη. Την ξαναμετασχημάτισα και προέκυψε η τελική μας πρόταση την οποία και μετέτρεψα σε sql:

"Nα βρόυμε τα ονόματα των πελατών για τους οποίους δεν υπάρχει ταινία παραγωγής της MGM από το 2000 και μετά και την οποίαν δεν νοικίασαν"

Χρησιμοποιείς το not exist 2 φορές, το ένα μέσα στο άλλο.

Δες και αυτό το link. Εμένα με βοήθσε πάρα πολύ. http://www2.cs.uh.edu/~marek/notes/lecture7/sld015.htm

Αν χρειαστείς κάτι άλλο το φωνάζεις :P

Όσον αφορά την ερώτηση e) με τα ζεύγη έχω δοκιμάσει αυτό που λές αλλά δεν δουλεύει. Πρέπει να γίνει με subqueries ετσι; Άμα μπορείς να μου στείλεις την απάντηση , θα σου ήμουν ευγνώμων.

Manousos
Δημοσιεύσεις: 10
Εγγραφή: 16 Δεκ 2009 02:16

'Ασκηση στην SQL

Δημοσίευση από Manousos » 17 Δεκ 2009 20:19

Απάντηση στο ερώτημα (e):

select distinct c.name , d.producer
from client c ,movie d
where (c.name, d.producer) not in (
select a.name, b.producer
from client a, movie b
where (a.client_id, b.movie_id) in
(select client_id ,movie_id from rent));

Τώρα θα προσπαθήσω το πρώτο αν ζοριστώ σου λέω...

Manousos
Δημοσιεύσεις: 10
Εγγραφή: 16 Δεκ 2009 02:16

'Ασκηση στην SQL

Δημοσίευση από Manousos » 17 Δεκ 2009 20:47

ok ολα τέλεια!!
δεν πολυκατάλαβα γιατί το (α) μου δουλεύει αλλα δουλεύει!!!
Migi στείλε να μου πεις αν ολα καλα με την απάντηση που σου έστειλα!!



Ευχαριστώ ολους οσους απαντησα και βοήθησαν!!!!

Απάντηση

Επιστροφή στο “MySQL”

Μέλη σε σύνδεση

Μέλη σε αυτήν τη Δ. Συζήτηση: Δεν υπάρχουν εγγεγραμμένα μέλη και 0 επισκέπτες