philos Δημοσ. 16 Αυγούστου 2014 Δημοσ. 16 Αυγούστου 2014 Χρειάζομαι τη βοήθειά σου για το εξής.Έχουμε το ακόλουθο query, το οποίο τραβάει πληροφορίες από τον πίνακα των μελών (για κάθε μέλος και group υπάρχει μια μοναδική γραμμή) : SELECT * FROM socialgroupmember WHERE groupid = $groupid AND userid = $userid Ο socialgroupmember είναι ο πίνακας των μελών για τα social groups:useridgroupiddateline (timestamp που εντάχθηκε ο userid στο group).[...] Στο παιχνίδι, βάζω και τους εξής πίνακες, οι οποίοι είναι profile fields, ανεξάρτητα για κάθε social group:A ) socialgroup_profilefieldcategory(περιέχει τα δεδομένα των κατηγοριών, από εδώ μέσω του groupid συνδέονται τα profile fields με το social group) :profilefieldcategoryid AUTO_INCRgroupidtitledisplayorder Β ) socialgroup_profilefield (περιέχει τα δεδομένα των profile fields)profilefieldid AUTO_INCRprofilefieldcategoryidtitledata (αποθηκεύω serialized)type (enum input, textarea, radio, select κτλ)C ) socialgroup_userfield (περιέχει το τι συμπληρώνει ο χρήστης σε κάθε profile field)dataid AUTO_INCRuseridprofilefieldiddata (userid και profilefieldid μοναδικά) Όπως καταλαβαίνετε κάθε profile field(id) είναι μοναδικό - δε μπορεί δλδ να αντιστοιχεί σε παραπάνω από ένα groupids. Αυτή τη στιγμή, για να τραβήξω τις πληροφορίες του μέλους, χρησιμοποιώ το πρώτο query που σας έγραψα, και ένα ξεχωριστό για να τραβήξω τα δεδομένα των profile fields: SELECT socialgroup_userfield.data, socialgroup_userfield.profilefieldid, socialgroup_profilefield.title AS fieldtitle, socialgroup_profilefieldcategory.title AS categorytitle FROM socialgroup_userfield AS socialgroup_userfield LEFT JOIN socialgroup_profilefield AS socialgroup_profilefield USING (profilefieldid) LEFT JOIN socialgroup_profilefieldcategory AS socialgroup_profilefieldcategory USING (profilefieldcategoryid) WHERE socialgroup_userfield.userid = $userid AND socialgroup_profilefieldcategory.groupid = $groupid Η ερώτησή μου, είναι, πως μπορώ να κάνω αυτό που θέλω με ΕΝΑ query; Στις δικές μου, αδύναμες προσπάθειες να ενώσω τα queries, αντιμετώπιζα πρόβλημα στο ότι θέλω να έχω μια γραμμή πίνακα πίσω για κάθε χρήστη, ενώ το ενωμένο query για τα profile fields μπορούν να επιστρέψει πάνω από 1 γραμμές. Οπότε έπερνα πίσω πολλαπλές γραμμές για το ίδιο userid. Είναι σημαντικό για μένα να έχω όλα τα δεδομένα με ένα query, καθώς αν θελήσω να τραβήξω πολλούς χρήστες με τα δεδομένα των profile fields τους, δε θα είναι καλή ιδέα να τρέχω ένα ξεχωριστό query γι' αυτά.
defacer Δημοσ. 16 Αυγούστου 2014 Δημοσ. 16 Αυγούστου 2014 Δε διάβασα πολύ προσεκτικά το σχήμα οπότε ίσως κάτι δεν έχω καταλάβει. Λες ότι παίρνεις πίσω πολλαπλές γραμμές για το ίδιο userid. Αυτό είναι και ο μόνος τρόπος με τον οποίο μπορούν να γίνουν τα πράγματα -- αν σε κάποιο user αντιστοιχούν Ν γραμμές από τον άλλο πίνακα όπου κάνεις join, προφανώς θα πάρεις N γραμμές όπου τα περιεχόμενα του "user μέρους" είναι ίδια. Το ίδιο γενικεύεται για παραπάνω από ένα πίνακες. Διαφορετικά πώς θα ήταν δυνατόν να πάρεις πίσω όλα τα δεδομένα από τις N γραμμές σε μία εφόσον το πόσα columns επιστρέφονται είναι σταθερά;
philos Δημοσ. 16 Αυγούστου 2014 Μέλος Δημοσ. 16 Αυγούστου 2014 Μάλλον έχεις δίκιο, απλά σκεφτόμουν αν ήταν εφικτό με το ίδιο query να έχω όλα τα δεδομένα τακτοποιημένα. Μήπως υστερεί η δομή των πινάκων μου; ή καλύτερα, είναι προγραμματιστικά ορθό να τα κάνω με ένα query και μετά στην php να φιλτράρω τα rows (= πίνακας με ένα row για κάθε userid) και να τοποθετώ τα δεδομένα των profile fields σε υπο- πίνακα (php) ;
defacer Δημοσ. 16 Αυγούστου 2014 Δημοσ. 16 Αυγούστου 2014 Η δομή των πινάκων φαίνεται μια χαρά και normalized, υποθέτω ότι δεν έγινε κατα λάθος. Αυτό που δεν γίνεται καλά είναι τα 1 + N queries που κάνεις. Και δεν έχω καταλάβει το εξής: όλες αυτές τις πληροφορίες τις θέλεις για ένα μέλος ή για πολλά; Κι αν πολλά, πώς καθορίζεται το σύνολο των μελών που μας ενδιαφέρουν; Το πώς θα γίνει καλύτερα το join και το αν υπάρχουν εναλλακτικές που αξίζει να δεις εξαρτώνται από την απάντηση. Αν και τα δύο σενάρια είναι εξίσου "ενδιαφέροντα" για σένα τότε για το καθένα πιθανότατα θα έχεις λίγο διαφορετική προσέγγιση.
philos Δημοσ. 16 Αυγούστου 2014 Μέλος Δημοσ. 16 Αυγούστου 2014 Η δομή των πινάκων φαίνεται μια χαρά και normalized, υποθέτω ότι δεν έγινε κατα λάθος. Αυτό που δεν γίνεται καλά είναι τα 1 + N queries που κάνεις. Και δεν έχω καταλάβει το εξής: όλες αυτές τις πληροφορίες τις θέλεις για ένα μέλος ή για πολλά; Κι αν πολλά, πώς καθορίζεται το σύνολο των μελών που μας ενδιαφέρουν; Το πώς θα γίνει καλύτερα το join και το αν υπάρχουν εναλλακτικές που αξίζει να δεις εξαρτώνται από την απάντηση. Αν και τα δύο σενάρια είναι εξίσου "ενδιαφέροντα" για σένα τότε για το καθένα πιθανότατα θα έχεις λίγο διαφορετική προσέγγιση. Και για ένα, και για πολλά. Για παράδειγμα μπορεί να τραβήξω για ένα μέλος: αυτόν ($userid) που φορτώνει τη σελίδα του group ($groupid) με μια συνάρτηση fetch_groupuserinfo($userid, $groupid). Αυτή η συνάρτηση θα ήθελα να επιστρέφει και τις πληροφορίες του πίνακα socialgroupmember και του userfield. Την έχω φτιάξει, απλά δουλεύει όπως εξήγησα στο αρχικό post. PS: Το userid προέρχεται από τον πίνακα user της πλατφόρμας. Ο socialgroupmember χρησιμοποιεί τα userids εκείνου του πίνακα, αλλά δε μας ενδιαφέρει στη φάση αυτή. Μπορεί όμως να θέλω να τραβήξω τα profile fields και για πολλά μέλη (πχ για να τα εμφανίζω στη λίστα μελών). Οπότε για κάθε γραμμή μέλους θα θέλω και τα profile fields και δε μπορώ να τρέχω πχ 15 extra queries ανά σελίδα, ένα για κάθε userid.
cyclo Δημοσ. 16 Αυγούστου 2014 Δημοσ. 16 Αυγούστου 2014 για να καταλάβω... για κάθε socialgroupmember καλείς το δεύτερο query που σου φέρνει αποτελέσματα;
philos Δημοσ. 16 Αυγούστου 2014 Μέλος Δημοσ. 16 Αυγούστου 2014 για να καταλάβω... για κάθε socialgroupmember καλείς το δεύτερο query που σου φέρνει αποτελέσματα; Ναι.. Θέλω τα δεδομένα των profile fields όπου εμφανίζεται μέλος (πχ στο τομέα του forum, δίπλα από κάθε post θέλω κι αυτά τα δεδομένα, οπότε όταν τραβάω τα posts, θα πρέπει κάπως να έχω και τα profile fields).
cyclo Δημοσ. 16 Αυγούστου 2014 Δημοσ. 16 Αυγούστου 2014 Ναι.. Θέλω τα δεδομένα των profile fields όπου εμφανίζεται μέλος (πχ στο τομέα του forum, δίπλα από κάθε post θέλω κι αυτά τα δεδομένα, οπότε όταν τραβάω τα posts, θα πρέπει κάπως να έχω και τα profile fields). κάνεις ένα printscreen με τους πίνακες αν έχεις την καλοσύνη; και αν τα πεδία συσχετίσεων έχουν διαφορετικά ονόματα αν έχεις την καλοσύνη γράψε και τις συσχετίσεις και θα βγάλουμε άκρη. γιατί είναι λίγο δύσκολο να καταλάβω έτσι όπως είναι γραμμένα. Επίσης, δεν καταλαβαίνω τι στοιχεία τραβάς από τον πρώτο για να κάνεις ερώτημα τη δεύτερη φορά... αφού και στα 2 queries το userid παίρνεις σαν παράμετρο.
Προτεινόμενες αναρτήσεις
Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε
Πρέπει να είστε μέλος για να αφήσετε σχόλιο
Δημιουργία λογαριασμού
Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!
Δημιουργία νέου λογαριασμούΣύνδεση
Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.
Συνδεθείτε τώρα