SQL join ερώτηση
Tasos Laskos
tasos.laskos at gmail.com
Fri Mar 27 16:59:12 EET 2009
Se MySQL mporeis na kaneis kati san:
--------------
SELECT *,
`users`.`id` as tmp,
`users_feeds`.`id` as id
FROM `users_feeds`
LEFT JOIN `users`
ON `users_feeds`.`user_id` = `users`.`id`
WHERE `users_feeds`.`id` = 1
--------------
Epeidi otan xrisimopoieis WHERE i MySQL 8a vgalei error pos to "id" field
einai ambiguous opote prepei na kaneis specify to table episis, px
`users`.`id` .
Me to "as" apla to metonomazeis gia na glytoseis to error.
An den ypirxe to WHERE 8a mporouse na einai etsi:
--------------
SELECT *
FROM `users_feeds`
LEFT JOIN `users`
ON `users_feeds`.`user_id` = `users`.`id`
--------------
Se ayti ti periptosi ta pedia tou JOINed table 8a kanoun overwrite ta
pedia tou protou.
An 8es to anti8eto apla antistrefeis ta table sto SELECT etsi:
--------------
SELECT *
FROM `users`
LEFT JOIN `users_feeds`
ON `users_feeds`.`user_id` = `users`.`id`
--------------
Den eimai sigouros se ti akrivos prospa8o na voi8iso i ti akrivos
prospa8o na episimano alla isos se voi8isei.
Θοδωρής Λύτρας wrote:
> Παιδιά σωστά τα λέτε, κανονικά αυτό θα έπρεπε να μη παίζει στο σχήμα της
> βάσης, ή τουλάχιστον τα όποια κοινά πεδία να έχουν και ίδιες τιμές, ώστε να
> αρκεί ένα NATURAL JOIN.
>
> Δυστυχώς οι πίνακες τους οποίους προσπαθώ να ενώσω είναι έτσι στραβά
> φτιαγμένοι, και επειδή δεν είναι ένας και δύο προσπαθώ να φτιάξω μια
> εφαρμογούλα για να τους συνενώνει σωστά. Και προσπαθούσα να βρω αν υπάρχει
> κάποιος τρόπος να το κάνω αυτόματα, χωρίς να πρέπει να "διαβάσω" τα πεδία και
> των δύο πινάκων και να επιλέξω με το χέρι τα σωστά.
>
> Φαίνεται όμως οτι δεν υπάρχει τέτοια περίπτωση, απ' ότι μου λέτε... Πάντως
> εντύπωση μου κάνει, γιατί το να υπάρχουν συνονόματα πεδία στους πίνακες είναι
> προφανώς ένα ρεαλιστικό σενάριο, και έχει προβλεφθεί (τουλάχιστον από την
> sqlite, υποθέτω και από τις άλλες RDBMS). Βρίσκω περίεργο λοιπόν που δεν
> υπάρχει κάποιο clause να ορίζει το αν θα πρέπει να κρατήσει και τα δύο πεδία
> ή μόνο το ένα.
>
> Θοδωρής
>
> Στις Παρ 27 Μαρ 2009, ο/η Tasos Laskos έγραψε:
>> 8a symfoniso me ton George kai sta 2 point tou.
>>
>> Sostotero 8a itan to mono koino paidio sta 2 table na einai to id me to
>> opoio ginete i antistixisi.
>>
>> George Zarogiannis wrote:
>>> Νομίζω ότι όντως ζητάς πολλά από την SQL :)
>>>
>>> Ο μοναδικός τρόπος που μπορώ να σκεφτώ, υποθέτωντας ότι γράφεις σε
>>> κάποια γλώσσα, είναι να διαβάσεις πρώτα τα πεδία των 2 πινάκων και
>>> μετά να φτιάξεις δυναμικά το SELECT ώστε να περιέχει κάθε όνομα πεδίου
>>> 1 φορά. Το πως θα το κάνεις αυτό, εξαρτάται από τη γλώσσα/βάση που
>>> δουλεύεις...
>>>
>>> πχ ένας τρόπος να δεις τα πεδία ενός table από τη java, ανεξάρτητα
>>> βάσης, είναι αυτός
>>> <http://www.roseindia.net/jdbc/jdbc-mysql/ColumnName.shtml>
>>>
>>> Αλλά αυτό που θες μου φαίνεται λίγο περίεργο... μήπως πρέπει να
>>> ξανασκεφτείς το σχήμα της βάσης;
>>>
>>> 2009/3/27 Theodore Lytras <thlytras at gmail.com
>>> <mailto:thlytras at gmail.com>>
>>>
>>> Έχω μια ερωτησούλα για όποιον ξέρει καλή SQL.
>>> Ψάχνω στον γκούγκλη αλλά άκρη δε βρίσκω....
>>>
>>> Έστω οτι έχω δύο πίνακες A και B, με σχέση 1:1 και κοινό πεδίο
>>> ονόματι id. Αν θέλω να συνενώσω τους δύο πίνακες, θα δώσω:
>>>
>>> SELECT * FROM A, B WHERE A.id = B.id;
>>>
>>> ή
>>>
>>> SELECT * FROM A INNER JOIN B USING(id);
>>>
>>> Το πρόβλημα τώρα προκύπτει στην περίπτωση που υπάρχουν πεδία στον Α
>>> και στον Β με το ίδιο όνομα. Οι δύο προηγούμενες εντολές κρατούν τα
>>> πεδία και των δύο πινάκων (αφού ορίζω SELECT * ), και (τουλάχιστο σε
>>> SQLite που δοκίμασα) τα πεδία του δεύτερου πίνακα μετονομάζονται με
>>> την προσθήκη ενός ":1" στο όνομά τους.
>>>
>>> Υπάρχει κάποιος τρόπος να φιλτράρω τα πεδία του δεύτερου πίνακα? Να
>>> του πω δηλαδή να επιλέξει όλα τα πεδία του πρώτου πίνακα, ΣΥΝ όλα τα
>>> πεδία του δεύτερου που δεν υπάρχουν στον πρώτο πίνακα. Βεβαίως αυτό
>>> με κάποιο expression, χωρίς δηλαδή να ξέρω εκ των προτέρων τι πεδία
>>> υπάρχουν στον ένα και στον άλλο πίνακα.
>>>
>>> Υπ'όψιν οτι δε μιλώ για NATURAL JOIN, που (αν τουλάχιστον το κατάλαβα
>>> σωστά) κρατά τις εγγραφές εκείνες εφόσον όλα τα "συνονόματα" πεδία
>>> έχουν ίδιες τιμές. Εγώ θέλω να του ορίζω σαφώς ένα κοινό πεδίο για
>>> INNER JOIN, και από τα υπόλοιπα "συνονόματα" πεδία να κρατά μόνο τις
>>> τιμές που έχει ο ένας πίνακας, ανεξαρτήτως τι έχει ο άλλος πίνακας.
>>>
>>> Γίνεται αυτό? Ή ζητώ πολλά από την SQL????
>>>
>>> Ευχαριστώ προκαταβολικά,
>>>
>>> Θοδωρής
>
> --
> linux-greek-users mailing list -- http://lists.hellug.gr
More information about the Linux-greek-users
mailing list