Προς το περιεχόμενο

Προτεινόμενες αναρτήσεις

Δημοσ.

Χρειάζομαι τη βοήθειά σου για το εξής.
Έχουμε το ακόλουθο query, το οποίο τραβάει πληροφορίες από τον πίνακα των μελών (για κάθε μέλος και group υπάρχει μια μοναδική γραμμή) :
 

          SELECT *
          FROM socialgroupmember
          WHERE groupid = $groupid AND userid = $userid

Ο socialgroupmember είναι ο πίνακας των μελών για τα social groups:
userid
groupid
dateline (timestamp που εντάχθηκε ο userid στο group).
[...]

 

Στο παιχνίδι, βάζω και τους εξής πίνακες, οι οποίοι είναι profile fields, ανεξάρτητα για κάθε social group:
A ) socialgroup_profilefieldcategory
(περιέχει τα δεδομένα των κατηγοριών, από εδώ μέσω του groupid συνδέονται τα profile fields με το social group) :
profilefieldcategoryid AUTO_INCR
groupid
title
displayorder
 
Β ) socialgroup_profilefield (περιέχει τα δεδομένα των profile fields)
profilefieldid AUTO_INCR
profilefieldcategoryid
title
data (αποθηκεύω serialized)
type (enum input, textarea, radio, select κτλ)

C ) socialgroup_userfield (περιέχει το τι συμπληρώνει ο χρήστης σε κάθε profile field)
dataid AUTO_INCR
userid
profilefieldid
data

(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 γι' αυτά.

Δημοσ.

Δε διάβασα πολύ προσεκτικά το σχήμα οπότε ίσως κάτι δεν έχω καταλάβει.

 

Λες ότι παίρνεις πίσω πολλαπλές γραμμές για το ίδιο userid. Αυτό είναι και ο μόνος τρόπος με τον οποίο μπορούν να γίνουν τα πράγματα -- αν σε κάποιο user αντιστοιχούν Ν γραμμές από τον άλλο πίνακα όπου κάνεις join, προφανώς θα πάρεις N γραμμές όπου τα περιεχόμενα του "user μέρους" είναι ίδια. Το ίδιο γενικεύεται για παραπάνω από ένα πίνακες.

 

Διαφορετικά πώς θα ήταν δυνατόν να πάρεις πίσω όλα τα δεδομένα από τις N γραμμές σε μία εφόσον το πόσα columns επιστρέφονται είναι σταθερά;

Δημοσ.

Μάλλον έχεις δίκιο, απλά σκεφτόμουν αν ήταν εφικτό με το ίδιο query να έχω όλα τα δεδομένα τακτοποιημένα. Μήπως υστερεί η δομή των πινάκων μου;

 

ή καλύτερα, είναι προγραμματιστικά ορθό να τα κάνω με ένα query και μετά στην php να φιλτράρω τα rows (= πίνακας με ένα row για κάθε userid) και να τοποθετώ τα δεδομένα των profile fields σε υπο- πίνακα (php) ;

Δημοσ.

Η δομή των πινάκων φαίνεται μια χαρά και normalized, υποθέτω ότι δεν έγινε κατα λάθος.

 

Αυτό που δεν γίνεται καλά είναι τα 1 + N queries που κάνεις. Και δεν έχω καταλάβει το εξής: όλες αυτές τις πληροφορίες τις θέλεις για ένα μέλος ή για πολλά; Κι αν πολλά, πώς καθορίζεται το σύνολο των μελών που μας ενδιαφέρουν; Το πώς θα γίνει καλύτερα το join και το αν υπάρχουν εναλλακτικές που αξίζει να δεις εξαρτώνται από την απάντηση. Αν και τα δύο σενάρια είναι εξίσου "ενδιαφέροντα" για σένα τότε για το καθένα πιθανότατα θα έχεις λίγο διαφορετική προσέγγιση.

Δημοσ.

Η δομή των πινάκων φαίνεται μια χαρά και 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.

Δημοσ.

για να καταλάβω...

 

για κάθε socialgroupmember 

καλείς το δεύτερο query που σου φέρνει αποτελέσματα;

Δημοσ.

για να καταλάβω...

 

για κάθε socialgroupmember 

καλείς το δεύτερο query που σου φέρνει αποτελέσματα;

Ναι.. Θέλω τα δεδομένα των profile fields όπου εμφανίζεται μέλος (πχ στο τομέα του forum, δίπλα από κάθε post θέλω κι αυτά τα δεδομένα, οπότε όταν τραβάω τα posts, θα πρέπει κάπως να έχω και τα profile fields).

Δημοσ.

Ναι.. Θέλω τα δεδομένα των profile fields όπου εμφανίζεται μέλος (πχ στο τομέα του forum, δίπλα από κάθε post θέλω κι αυτά τα δεδομένα, οπότε όταν τραβάω τα posts, θα πρέπει κάπως να έχω και τα profile fields).

 

 

κάνεις ένα printscreen με τους πίνακες αν έχεις την καλοσύνη;

και αν τα πεδία συσχετίσεων έχουν διαφορετικά ονόματα αν έχεις την καλοσύνη γράψε και τις συσχετίσεις

και θα βγάλουμε άκρη.

 

γιατί είναι λίγο δύσκολο να καταλάβω έτσι όπως είναι γραμμένα.

 

Επίσης, δεν καταλαβαίνω τι στοιχεία τραβάς από τον πρώτο για να κάνεις ερώτημα τη δεύτερη φορά... αφού και στα 2 queries το userid παίρνεις σαν παράμετρο.

Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!

Δημιουργία νέου λογαριασμού

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα
  • Δημιουργία νέου...