SQL Query

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

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

Απάντηση
Άβαταρ μέλους
Risk
Δημοσιεύσεις: 319
Εγγραφή: 02 Μάιος 2006 01:16
Τοποθεσία: Κάπου εδώ γύρω...
Επικοινωνία:

SQL Query

Δημοσίευση από Risk » 09 Ιαν 2007 01:25

Sql programmers ζητώ την βοήθειά σας. Μετά από μια βδομάδα προσπαθειών δεν μπόρεσα να βγάλω το επιθυμητό αποτέλεσμα και γι' αυτό εναποθέτω τις ελπίδες μου στην δική σας βοήθεια.

Λοιπόν στο θέμα...φτιάχνω μια εφαρμογή php/mysql(κλασσικά πράγματα) που είναι για δημιουργία και διαχείρηση ηλεκτρονικών τάξεων! Για τον λόγο αυτό έχω φτιάξει και μια βάση. Οι πίνακες οι οποίοι μας ενδιαφέρουν είναι οι παρακάτω

-->Student: un_student(username μαθητή)/section(Εξάμηνο)/direction(Κατεύθυνση)
-->Member: id_class/ id_student / active (enum('0','1'))
-->Eclass: id /code/ tilte/ section / direction/id_teacher

Λοιπόν μια σύντομη περιγραφή. Ο πίνακας eclass αναφέρετε στα διάφορα μαθήματα (κάθε μάθημα αποτελεί και μια ηλ. τάξη). Κάθε στοιχείο λοιπόν του πίνακα eclass έχει ένα id, έναν code, ένα title, ανήκει σε συγκεκριμένο εξάμηνο (section) και σε συγκεκριμένη κατεθυνση(direction). Μεταξύ της ονότητας eclass και student υπάρχει η συσχέτιση member(μέλος). Στην συσχέτιση αυτή έχουμε τα πεδία που σας ανέφερα.

Τι γίνεται λοιπόν, ένας μαθητής απο σχετικές σελίδες θα ενημερώνετε σε ποια μαθήματα συμμετέχει [active = 1], σε ποιά μαθήματα έχει αιτηθεί την συμμετοχή του [active=0] και σε ποια ακόμα μαθήματα μπορεί να κάνει αίτηση σημμετοχής με βάση το εξάμηνο και την κατεύθυνση στην οποία βρίσκεται. Στις δυο πρώτες περιπτώσεις δεν αντιμετωπίζω κανένα απολύτος πρόβλημα στα queries. Στο τρίτο υπάρχει το προβλημα. Δείτε λίγο το query που κάνω:

Κώδικας: Επιλογή όλων

 SELECT eclass.id, eclass.title, eclass.section
FROM member, eclass, student, user
WHERE student.un_student = 'nick'
AND student.un_student = member.id_student
AND member.id_class != eclass.id
AND eclass.direction = student.direction
AND eclass.section <= student.section


To query θέλω να μου επιστρέφει τα μαθήματα στα οποία ο μαθητής 'nick' δεν έχει εκδηλώσει κανένα ενδιαφέρον, δηλαδή ούτε συμμετέχει ούτε έχει αιτηθεί την συμμετοχή του, αλλά βάση του εξαμήνου του και της κατεύθυνσής του μπορεί να τα παρακολουθήσει.

Αντι γι'αυτό μου επιστρέφει και το μάθημα στο οποίο συμμετέχει, και το μάθημα στο οποίο έχει αιτηθεί να συμμετάσχει, αλλά και τα μαθήματα για τα οποία δεν έχει εκδηλώσει κάποιο ενδιαφέρον, αλλά μπορεί να συμμετάσχει με βάση την κατεύθυνση και το εξάμηνο του.

Σας δείχνω παρακάτω (με πολύ πρόχειρο τρόπο!) και το αποτέλεσμα που μου έρχεται από το phpmyadmin εκτελώντας αυτό το ερώτημα. Στην περίπτωση αυτή ο μαθητής 'nick' συμμετέχει στο μάθημα Βάσεις Δεδομένων Ι, έχει ατηθεί την συμμετοχή του στο μάθημα Βάσεις Δεδομένων ΙΙ, ενώ έχει το δικαίωμα αν θέλει να αιτηθεί και την συμμετοχή του στα μαθήματα Τεχνολογία Πολυμέσων και Γραφικά Υπολογιστών.

id title section
2 ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι 4
3 ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ ΙΙ 5
4 ΤΕΧΝΟΛΟΓΙΑ ΠΟΛΥΜΕΣΩΝ 6
4 ΤΕΧΝΟΛΟΓΙΑ ΠΟΛΥΜΕΣΩΝ 6
7 ΓΡΑΦΙΚΑ ΥΠΟΛΟΓΙΣΤΩΝ 2
7 ΓΡΑΦΙΚΑ ΥΠΟΛΟΓΙΣΤΩΝ 2




Αυτά!!! Sorry αν κούρασα! Όποιος μπορεί ας με βοηθήσει!
Ευχαριστώ!
Εικόνα

Άβαταρ μέλους
fafos
Script Master
Δημοσιεύσεις: 6231
Εγγραφή: 30 Νοέμ 2004 03:09

SQL Query

Δημοσίευση από fafos » 09 Ιαν 2007 03:17

Mhpos prepei na valeis kai ena:

AND member.active = ''
Οι πάνες και οι πολιτικοί πρέπει να αλλάζονται συχνά για τον ίδιο λόγο...

Άβαταρ μέλους
shadow
Script Master
Δημοσιεύσεις: 606
Εγγραφή: 14 Απρ 2005 18:30

SQL Query

Δημοσίευση από shadow » 09 Ιαν 2007 09:14

Εγώ θα χρησιμοποιούσα κάτι σαν το παρακάτω

Κώδικας: Επιλογή όλων

SELECT eclass.id, eclass.title, eclass.section
FROM eclass
--select students that can go to class
INNER JOIN student on eclass.direction = student.direction AND eclass.section <= student.section
--select all&#40;current,future&#41; members of class 
LEFT OUTER JOIN member on member.id_student = student.un_student
WHERE student.un_student = 'nick' 
      AND
      --student hasn't the lessons	  
	  member.id_student is null 
Close your eyes
For your eyes will only tell the truth and the truth isnt what you want to see
In the dark, is it easy to pretend that the truth is it ought to be.
Programmers are programmers because they like to code

Άβαταρ μέλους
Risk
Δημοσιεύσεις: 319
Εγγραφή: 02 Μάιος 2006 01:16
Τοποθεσία: Κάπου εδώ γύρω...
Επικοινωνία:

SQL Query

Δημοσίευση από Risk » 09 Ιαν 2007 13:21

Thanks a lot και στους δυο σας για το ενδιαφέρον!

Fafo το είχα σκεφτεί το member.active να το βάζω μέσα στην συνθήκη ελέχγου ,όπως και το είχα βάλει, αλλά δεν έκανε τίποτα καθώς το member.active αφορά μαθήματα τα οποία είτε ο μαθητής συμμετέχει, δλδ active='1', είτε μαθήματα στα οποία ο μαθητής έχει αιτηθεί την συμμετοχή του,δλδ active='0'. Εγώ ήθελα το query να μου επιστρέφει μαθήματα για τα οποία ο μαθητής δεν έχει εκδηλώσει κανένα ενδιαφέρων,δηλαδή active!='0' AND active!='1', αλλά τότε κάπως έμπλεκε το πράγμα και δεν μου έδινε κανένα αποτέλεσμα!

Shadow απ' ότι έχω δει και σε κάτι άλλα post το JOIN είναι το αγαπημένο σου και επειδή κάπως έτσι πίστευα και εγώ πως είναι το σωστό, και όντως έτσι είναι, με βοήθησες πάρα πολύ! Thanks! Η μόνη διαφορά σε αυτό που μου έδωσες εσύ είναι ότι πρόσθεσα στο LEFT OUTER JOIN μια ακόμα συνθήκη, δλδ έβαλα επιπλέον "...AND member.id_class=eclass.id" και έτσι μου βγήκε το αποτέλεσμα που ήθελα, γιατί διαφορετικά δεν μου επέστρεφε καμία τιμή. Απ' ότι κατάλαβα ήθελε πρώτα να ταυτοποιηθούν και τα id που βρίσκονται και στους δυο πίνακες και αυτά που έμενα χωρίς id, δλδ "member.id_class IS NULL", να τα φέρνει!

Για άλλη μια φορά τα μέλη του freestuff έδρασαν έγκαιρα και πετυχημένα! Σας ευχαριστώ και πάλι!!!
Εικόνα

Απάντηση

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

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

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