SQL help

Συζητήσεις για γλώσσες προγραμματισμού και θέματα σχετικά με προγραμματισμό.
Post Reply
User avatar
PaP
Venus Project Founder
Venus Project Founder
Posts: 1077
Joined: Wed Apr 21, 2004 12:06 am
Academic status: Alumnus/a
Location: San Francisco
Contact:

SQL help

Post by PaP » Wed Jun 27, 2007 6:56 pm

Code: Select all

SELECT DISTINCT rooms.id 
FROM rooms, contracts 
WHERE rooms.id != contracts.room_id 
AND '2007-06-29' <= contracts.end_date AND '2007-09-12' >= contracts.start_date

Code: Select all

SELECT DISTINCT rooms.id 
FROM rooms, contracts 
WHERE rooms.id = contracts.room_id 
AND '2007-06-29' <= contracts.end_date AND '2007-09-12' >= contracts.start_date
Δε ξέρω αν μπορεί να βοηθήσει κάποιος γιατί σπάω το κεφάλι μου χωρίς απότελεσμα εδώ και 5 ώρες περίπου. Εχω 2 πίνακες τους rooms και contracts... Ο δεύτερος περιέχει ένα πεδίο room_id το οποίο δειχνει στο rooms. To where clause δεν μας πολυ νοιάζει... Αλλά υποτίθεται ότι το rooms.id != contracts.room_id αποκλίει τις εγγραφές για τις οποίες ισχύει αυτο που είναι από τo ΑND και μετά, αλλά εμφανίζει τα πάντα... !!!
Και όταν βάζω rooms.id = contracts.room_id τότε απλά εμφανίζει αυτά που θέλω να αποκλείσω. Δοκίμασα και nested query

Code: Select all

SELECT DISTINCT room_id FROM rooms WHERE id NOT IN (SELECT room_id FROM contracts WHERE '2007-06-29' <= end_date AND '2007-09-12' >= start_date
Αλλά η χαζό mysql αρνείται να εκτελέσει queries μέσα σε παρένθεση !!
User avatar
Luke
Gbyte level
Gbyte level
Posts: 1388
Joined: Wed Aug 09, 2006 11:19 am
Academic status: Alumnus/a
Gender:

Post by Luke » Wed Jun 27, 2007 8:19 pm

Πάντως στο φωλιασμένο query, αν έχεις έκδοση mysql που υποστηρίζει τα φωλιασμένα queries, λείπει η τελευταία δεξιά παρένθεση και ίσως αυτό να δημιουργεί το πρόβλημα.
Είμαι ένας μοναχικός cowboy...
User avatar
PaP
Venus Project Founder
Venus Project Founder
Posts: 1077
Joined: Wed Apr 21, 2004 12:06 am
Academic status: Alumnus/a
Location: San Francisco
Contact:

Post by PaP » Wed Jun 27, 2007 9:33 pm

απλά στο copy paste δεν υπάρχει... τέσπα το έλυσα με πολύ μπακαλίστικο τρόπο αν βρω στιγμή θα το κοιτάξω αλλά είναι πολύ περίεργο
User avatar
tsilochr
Wow! Terabyte level
Wow! Terabyte level
Posts: 3246
Joined: Tue Mar 16, 2004 2:47 pm
Academic status: PhD
Gender:
Location: mm.aueb.gr
Contact:

Post by tsilochr » Wed Jun 27, 2007 9:49 pm

παίζεις με το EXIST που είναι και η πιο optimized λύση

Code: Select all

SELECT DISTINCT rooms.id
FROM rooms
WHERE ΝΟΤ EXISTS (SELECT 1 from  contracts where rooms.id = contracts .room_id)  AND ...
ανάλογα την έκδοση SQL ίσως θέλει alias στο select

Code: Select all

SELECT DISTINCT rooms.id as RID
FROM rooms
WHERE ΝΟΤ EXISTS (SELECT 1 from  contracts where RID = contracts .room_id ) AND ...
Δοκίμασε το και αν παίξει, plz πες το για να δω αν κατάλαβα σωστά. Επίσης παίξε με dateif και between
Last edited by tsilochr on Wed Jun 27, 2007 9:51 pm, edited 1 time in total.
User avatar
PaP
Venus Project Founder
Venus Project Founder
Posts: 1077
Joined: Wed Apr 21, 2004 12:06 am
Academic status: Alumnus/a
Location: San Francisco
Contact:

Post by PaP » Wed Jun 27, 2007 9:50 pm

σωστά το λες αλλά όταν βάλω ένα query σε παρένθεση δε το εκτελεί !! φταίει η έκδοση (5.0 αλλά και ο σερβερ ειναι 4.1 και πάλι σκ@@@@λες)
vasvas
Kilobyte level
Kilobyte level
Posts: 198
Joined: Fri Jul 09, 2004 2:31 pm

Post by vasvas » Fri Jun 29, 2007 9:56 pm

Λοιπόν, η επερώτησή σου προφανώς τα βγάζει όλα τα room.id, διότι σχεδόν κάθε συνδυασμός room.id και contract room.id περνάει το πρώτο τεστ, σωστά;

Πχ
room
1 blah
2 blah
3 foo


contracts
contract id room_id
1 1
2 2
3 2
4 1

Οταν κάνω το
FROM rooms, contracts
where room.id != contract.room_id

ποιές πλειάδες θα πάρω πίσω;

1 blah 2 2
1 blah 3 2
2 blah 1 1
2 blah 4 1
3 foo 1 1
3 foo 2 2
3 foo 3 2
3 foo 4 1

Όπως βλέπεις, η λίστα έχει όλα τα room.id. Δηλ. η επερώτηση δεν κάνει αυτό που θέλεις. Αν τη γράψεις σε σχεσιακή άλγεβρα μπορείς να αποδείξεις εύκολα ότι οι δυο SQL που δίνεις δεν είναι ισοδύναμες.

Το nested subquery σύμφωνα με το manual υποστηρίζεται
http://dev.mysql.com/doc/refman/5.0/en/subqueries.html

Εκτός από τις λύσεις με το nested subquery, μπορείς να χρησιμοποιήσεις τον τελεστή Difference , δηλ να αφαιρέσεις από το ROOMS αυτά που δε θες (που είναι στο nested subquery)
δηλ να γράψεις ROOMS DIFFERENCE (SELECT .... )
Ομως αυτό δεν το υποστηρίζει η ΜySQL. Τρίτη λύση: φτιάξε ένα stored procedure (που τα υποστηρίζει).
Post Reply

Return to “Προγραμματισμός”