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