philos Δημοσ. 29 Μαΐου 2013 Δημοσ. 29 Μαΐου 2013 Χρειάζομαι τη βοήθειά σας σε ένα query ή άλλη πρόταση-λύση γι αυτό που θέλω να κάνω. Λοιπόν, έχουμε τους εξής πίνακες που αφορούν ένα σύστημα groups. Σας παραθέτω μόνο τα columns που θα χρειαστούν για το πρόβλημα:*user (δεδομένα χρηστών)- userid- username*socialgroup (περιέχει τα στοιχεία των groups)- groupid- name*socialgroupmember (περιέχει ποιοι χρήστες είναι μέλη σε κάθε group)- userid- groupid*discussion (περιέχει τα δεδομένα των συζητήσεων)- discussionid- groupid- firstpostid- lastpostid- lastpost (timestamp)- lastposter- lastposterid*groupmessage (περιέχει τα δεδομένα των μηνυμάτων των συζητήσεων)- gmid- discussionid- title- postuserid- dateline (timestamp)*announcement (περιέχει τα δεδομένα των ανακοινώσεων των groups)- announcementid- groupid- title- dateline (timestamp)Αυτό που θέλω, είναι ένα query που θα εξάγει τα τελευταία μηνύματα και τις τελευταίες ανακοινώσεις σε σειρά dateline DESC, για τα groups στα οποία ο χρήστης είναι μέλος.Δηλαδή αν μια ανακοίνωση είναι πιο πρόσφατη από ένα μήνυμα, θα πρέπει να εμφανίζεται πιο ψηλά στα αποτελέσματα και το αντίστροφο.Προσοχή όμως, υπάρχει μια ιδιαιτερότητα στην εμφάνιση των τελευταίων μηνυμάτων: επιθυμώ για κάθε discussion να εμφανίζεται μόνο ένα στοιχείο στα αποτελέσματα. Δηλαδή αν οι χρήστες κάνουν πχ 5 συνεχόμενα μηνύματα σε μία discussion, δεν θέλω να δω 5 στοιχεία στη λίστα αποτελεσμάτων, αλλά 1 (με τον τίτλο του μηνύματος (groupmessage -> title) και ημερομηνία του τελευταίου μηνύματος.Το ακόλουθο query επιστρέφει μόνο τα τελευταία μηνύματα, σύμφωνα με τις απαιτήσεις μου: SELECT discussion.*, user.username, socialgroup.name, groupmessage.dateline, groupmessage.title FROM _vbdiscussion AS discussion LEFT JOIN _vbgroupmessage AS groupmessage ON(groupmessage.gmid = discussion.lastpostid) LEFT JOIN _vbuser AS user ON(user.userid = discussion.lastposterid) LEFT JOIN _vbsocialgroup AS socialgroup ON (discussion.groupid = socialgroup.groupid) LEFT JOIN _vbsocialgroupmember AS socialgroupmember ON (socialgroupmember.groupid = socialgroup.groupid) WHERE socialgroupmember.userid = ". intval($userid) ." ORDER BY groupmessage.dateline DESC LIMIT 10 Τι μπορώ να κάνω για να συμπεριλάβω και τις ανακοινώσεις; Έχω κάνει μερικές προσπάθειες, αλλά με λάθος αποτελέσματα.Ο τελικός html πίνακας είναι εύκολο να διαμορφωθεί με μερικές if που θα τσεκάρουν αν έχει επιστραφεί announcementid ή gmid.Δεκτές και προτάσεις για άλλες λύσεις, αν έχετε κατά νου κάτι.
mad-proffessor Δημοσ. 29 Μαΐου 2013 Δημοσ. 29 Μαΐου 2013 Θελει περισσότερη κανονικοποιήση ο πίνακας discussion να γίνει επιπλέον και ο posts με πεδία(post_id ) κτλ.
philos Δημοσ. 31 Μαΐου 2013 Μέλος Δημοσ. 31 Μαΐου 2013 Θελει περισσότερη κανονικοποιήση ο πίνακας discussion να γίνει επιπλέον και ο posts με πεδία(post_id ) κτλ. Κοίτα, όλοι οι παραπάνω πίνακες, με εξαίρεση τον announcement, είναι οι default πίνακες της πλατφόρμας vbulletin, οπότε δεν θα ήθελα να τους πειράξω. Θέλουμε να εξάγουμε σε έναν πίνακα τα τελευταία στοιχεία: μηνύματα & ανακοινώσεις με ταξινόμηση βάσει σφραγίδας χρόνου. Είναι εφικτό να γίνει αυτό με τα παραπάνω ως δεδομένα; Σε ευχαριστώ! Πέτρος
PavelX Δημοσ. 1 Ιουνίου 2013 Δημοσ. 1 Ιουνίου 2013 Γιατί δεν κάνεις ένα δεύτερο ερώτημα με τον announcement, να συνδέσεις τα 2 ερωτήματα με ένα UNION και να κάνεις ένα επιπλέον ORDER BY στα νέα αποτελέσματα; 1
Konsul Δημοσ. 1 Ιουνίου 2013 Δημοσ. 1 Ιουνίου 2013 Χρειάζομαι τη βοήθειά σας σε ένα query ή άλλη πρόταση-λύση γι αυτό που θέλω να κάνω. Αυτό που θέλω, είναι ένα query που θα εξάγει τα τελευταία μηνύματα και τις τελευταίες ανακοινώσεις σε σειρά dateline DESC, για τα groups στα οποία ο χρήστης είναι μέλος. Δηλαδή αν μια ανακοίνωση είναι πιο πρόσφατη από ένα μήνυμα, θα πρέπει να εμφανίζεται πιο ψηλά στα αποτελέσματα και το αντίστροφο. Προσοχή όμως, υπάρχει μια ιδιαιτερότητα στην εμφάνιση των τελευταίων μηνυμάτων: επιθυμώ για κάθε discussion να εμφανίζεται μόνο ένα στοιχείο στα αποτελέσματα. Δηλαδή αν οι χρήστες κάνουν πχ 5 συνεχόμενα μηνύματα σε μία discussion, δεν θέλω να δω 5 στοιχεία στη λίστα αποτελεσμάτων, αλλά 1 (με τον τίτλο του μηνύματος (groupmessage -> title) και ημερομηνία του τελευταίου μηνύματος. Το ακόλουθο query επιστρέφει μόνο τα τελευταία μηνύματα, σύμφωνα με τις απαιτήσεις μου: Αν κατάλαβα καλά εδώ θα χρειαστεί να κάνεις UNION (ανάμεσα σε 2 SELECT) στο query σου. SELECT groupmessage as action, groupmessage.dateline as timedate groupmessage.gmid, groupmessage.discussionid, groupmessage.title, groupmessage.postuserid, FROM groupmessage JOIN socialgroupmember ON socialgroupmember.userid = groupmessage.discussionid WHERE socialgroupmember.userid = ". intval($userid) ." UNION SELECT announcement as action, announcement.dateline as timedate announcement.field JOIN socialgroupmember ON socialgroupmember.groupid=announcement.groupid WHERE .. ORDER BY timedate DESC (σίγουρα θα θέλει και κάποια έξτρα JOINS που πιθανότατα έχεις ήδη βάλει) Τέλος πάντων επειδή τώρα δεν έχω μπροστά μου την βάση να την τεστάρω, αλλά πιστεύω να καταλαβαίνεις τι θέλω να σου πω. Σημασία έχει το as 'timedate' να έχει το ίδιο Alias για να βλέπει το timestamp "σαν ένα" ανάμεσα στα tables και να κάνει το σωστό ORDER BY. Και το as 'action' το έβαλα για να σε βοηθήσει όταν θέλεις να εκτυπώσεις τα αποτελέσματα έτσι ώστε να ξέρεις σε ποιον πίνακα βρίσκεσαι π.χ (if(action=='announcement') ..... Ελπίζω να βοήθησα..
philos Δημοσ. 1 Ιουνίου 2013 Μέλος Δημοσ. 1 Ιουνίου 2013 Σας ευχαριστώ πολύ παιδιά, πράγματι ένα UNION χρειαζόταν, το έμαθα κι αυτό.
Προτεινόμενες αναρτήσεις
Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε
Πρέπει να είστε μέλος για να αφήσετε σχόλιο
Δημιουργία λογαριασμού
Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!
Δημιουργία νέου λογαριασμούΣύνδεση
Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.
Συνδεθείτε τώρα