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

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

Δημοσ.

Χρειάζομαι τη βοήθειά σας σε ένα query ή άλλη πρόταση-λύση γι αυτό που θέλω να κάνω. :D
Λοιπόν, έχουμε τους εξής πίνακες που αφορούν ένα σύστημα 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.

Δεκτές και προτάσεις για άλλες λύσεις, αν έχετε κατά νου κάτι.
Δημοσ.

Θελει περισσότερη κανονικοποιήση ο πίνακας discussion να γίνει επιπλέον και ο posts με πεδία(post_id ) κτλ.

Κοίτα, όλοι οι παραπάνω πίνακες, με εξαίρεση τον announcement, είναι οι default πίνακες της πλατφόρμας vbulletin, οπότε δεν θα ήθελα να τους πειράξω.

Θέλουμε να εξάγουμε σε έναν πίνακα τα τελευταία στοιχεία: μηνύματα & ανακοινώσεις με ταξινόμηση βάσει σφραγίδας χρόνου. Είναι εφικτό να γίνει αυτό με τα παραπάνω ως δεδομένα;

 

Σε ευχαριστώ!

Πέτρος

Δημοσ.

Γιατί δεν κάνεις ένα δεύτερο ερώτημα με τον announcement, να συνδέσεις τα 2 ερωτήματα με ένα UNION και να κάνεις ένα επιπλέον ORDER BY στα νέα αποτελέσματα;

  • Like 1
Δημοσ.

 

Χρειάζομαι τη βοήθειά σας σε ένα query ή άλλη πρόταση-λύση γι αυτό που θέλω να κάνω. :D

 

 

Αυτό που θέλω, είναι ένα 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')  .....

 

Ελπίζω να βοήθησα.. B)

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

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

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

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

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

Σύνδεση

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

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