Δημιουργία τελικού πίνακα δεδομένων και SORT

Σε αυτή την περιοχή μπορείτε να βρείτε ή να αναζητήσετε πληροφορίες σχετικές με την PHP

Συντονιστές: WebDev Moderators, Super-Moderators

Απάντηση
Άβαταρ μέλους
philos
Δημοσιεύσεις: 264
Εγγραφή: 30 Αύγ 2007 23:32

Δημιουργία τελικού πίνακα δεδομένων και SORT

Δημοσίευση από philos » 01 Μαρ 2013 19:53

Προσπαθώ να κάνω sort έναν "τελικό" array, αλλά κάτι κάνω λάθος!

Λοιπόν, όταν θέλω να εξάγω τις ανακοινώσεις από έναν υποθετικό πίνακα announcements (announcementid, title, text, dateline, groupid) για ΕΝΑ section του site (groupid), order by dateline DESC, κάνω τα εξής (σας παρουσιάζω πρόχειρα τις κινήσεις μου) :
α) query
$announcements =
SELECT *
FROM announcements
WHERE groupid = X
ORDER BY dateline DESC

β) php κώδικας
while ($announcement = $db->fetch_array($announcements))
{
eval('$announcementbits .= "' . fetch_template('announcement_bit') . '";');
}

Έτσι, η $announcementbits έχει τον html κώδικα με τις ανακοινώσεις (πρόκειται για μηχανή vbulletin και το πρόβλημα το παραθέτω προσαρμοσμένο ως υπόθεση ώστε να καταλάβετε).

Αυτά για ένα groupid. Προσπαθώ να εξάγω τα $announcementbits για πάνω από ένα groupids (για τα groups που ο χρήστης είναι μέλος):
α) query τροφοδοσίας των groupids που θέλω
$groups_query = SELECT groupid
FROM groups
LEFT JOIN members ON (members.groupid = group.groupid)
WHERE members.userid = X

β) php κώδικας:
while ($current = $vbulletin->db->fetch_array($groups_query))
{
$announcements =
SELECT *
FROM announcements
WHERE groupid = $current[groupid]
ORDER BY dateline DESC
while ($announcement = $db->fetch_array($announcements))
{
eval('$announcementbits .= "' . fetch_template('announcement_bit') . '";');
}
}

Με τον τρόπο αυτό, αν υποθέσουμε ότι η while έτρεξε για 2 groupids, το $announcementbits καταλήγει να έχει πρώτα τις ανακοινώσεις του πρώτου groupid σε σειρά by dateline DESC και ΑΜΕΣΩΣ μετά ΚΟΛΛΗΤΑ τις ανακοινώσεις του δεύτερου groupid σε σειρά dateline DESC.
Εγώ θέλω το $announcementbits να έχει ΟΛΕΣ τις ανακοινώσεις sort by dateline. Όχι πρώτα του ενός groupid, μετά του άλλου κτλ κτλ.

Πως θα φτιάξω έναν πίνακα $final_announcements με κλειδιά (announcementid, title, text, dateline, groupid), ο οποίος θα έχει τις ανακοινώσεις όλων των groups sort by dateline?

Δοκίμασα να βάλω στη 2η while ένα "$final_announcements[] = $announcement;" αντί για το build των $announcementbits, και τελικά στο τέλος να κάνω ένα:
krsort($final_announcements, 'dateline');
foreach ($final_announcements AS $announcement)
{
eval('$announcementbits .= "' . fetch_template('socialgroup_announcement_bit') . '";');
}

Αλλά βγάζει error. Δεν μου είχε ξανα χρειαστεί κάτι τέτοιο, γι' αυτό δεν ξέρω πως να το αντιμετωπίσω. Μέχρι στιγμής έβγαζα ανακοινώσεις για ένα groupid, και είχα έτοιμο τον πίνακα από το query ORDER BY και το fetch_array.

Ευχαριστώ!

Άβαταρ μέλους
nirvana
Δημοσιεύσεις: 241
Εγγραφή: 01 Σεπ 2005 18:28
Τοποθεσία: Αγ. Παρασκευή

Δημιουργία τελικού πίνακα δεδομένων και SORT

Δημοσίευση από nirvana » 01 Μαρ 2013 22:18

Den eimai sigouros an katalava to provlima, alla giati den vgazeis to ekswteriko while kai to query na ginei kapws etsi:

Κώδικας: Επιλογή όλων

SELECT * 
FROM announcements 
WHERE groupid IN (implode("','",$vbulletin->db->fetch_array($groups_query)))
ORDER BY dateline DESC 
Auto einai lathos san syntax (psilo-psevdokedikas), alla eplizw na katalaves ti ennow..

Άβαταρ μέλους
philos
Δημοσιεύσεις: 264
Εγγραφή: 30 Αύγ 2007 23:32

Δημιουργία τελικού πίνακα δεδομένων και SORT

Δημοσίευση από philos » 01 Μαρ 2013 23:12

Καλή ιδέα, πωπω δε τη σκέφτηκα καθόλου και είχα οδηγηθεί σε μία προφανώς πιο δύσκολη λύση :oops: :oops:
Βασικά το query στο πραγματικό πρόβλημα τροφοδοτεί κι άλλα στοιχεία πέρα από το groupid. Οπότε θα βάλω μια while όπου θα εκχωρεί σε πίνακα μόνο τα groupids και τέλος θα χρησιμοποιήσω την implode στο query των announcements, με WHERE groupid IN ()

Ευχαριστώ για την ιδέα, αν κολλήσω πάλι κάπου θα ποστάρω :)

Άβαταρ μέλους
jpk
Δημοσιεύσεις: 441
Εγγραφή: 09 Μαρ 2011 21:17

Δημιουργία τελικού πίνακα δεδομένων και SORT

Δημοσίευση από jpk » 01 Μαρ 2013 23:45

Δεν θα σχολιάσω την ονοματοδοσία και το μοντέλο των δεδομένων , πάω κατευθείαν σε αυτό που ρωτάς. Πάμε λίγο και μου λες αν έχω καταλάβει κάτι λάθος , λες :

Κώδικας: Επιλογή όλων

SELECT groupid
FROM groups
LEFT JOIN members ON (members.groupid = group.groupid)
WHERE members.userid = ? 
Γιατί το λες αυτό ; Υπάρχει περίπτωση να υπάρχει κάποιο groupid σε κάποιο row του members χωρίς να υπάρχει στον πίνακα group; Λογικά δεν θα έπρεπε να υπάρχει τέτοια περίπτωση .

Άρα δεν θα αρκούσε;

Κώδικας: Επιλογή όλων

SELECT a.* 
FROM announcements AS a 
JOIN members AS b 
ON b.groupid = a.groupid 
WHERE b.userid = ? 
ORDER BY a.dateline DESC 
Η εμπλοκή του groups θα είχε νόημα αν για κάποιο λόγο μπορεί να υπάρχει groupid στον members αλλά δεν υπάρχει στον groups (οπότε και πάλι η λύση είναι με ένα statement) ή αν υπάρχει η λογική του status πάνω στον groups. Όπως και να έχει τα JOINS πρέπει να γίνονται πάνω σε indexes.

Άβαταρ μέλους
philos
Δημοσιεύσεις: 264
Εγγραφή: 30 Αύγ 2007 23:32

Δημιουργία τελικού πίνακα δεδομένων και SORT

Δημοσίευση από philos » 02 Μαρ 2013 00:14

jpk έγραψε:Δεν θα σχολιάσω την ονοματοδοσία και το μοντέλο των δεδομένων , πάω κατευθείαν σε αυτό που ρωτάς. Πάμε λίγο και μου λες αν έχω καταλάβει κάτι λάθος , λες :

Κώδικας: Επιλογή όλων

SELECT groupid
FROM groups
LEFT JOIN members ON (members.groupid = group.groupid)
WHERE members.userid = ? 
Άρα δεν θα αρκούσε;

Κώδικας: Επιλογή όλων

SELECT a.* 
FROM announcements AS a 
JOIN members AS b 
ON b.groupid = a.groupid 
WHERE b.userid = ? 
ORDER BY a.dateline DESC 
Η εμπλοκή του groups θα είχε νόημα αν για κάποιο λόγο μπορεί να υπάρχει groupid στον members αλλά δεν υπάρχει στον groups (οπότε και πάλι η λύση είναι με ένα statement) ή αν υπάρχει η λογική του status πάνω στον groups. Όπως και να έχει τα JOINS πρέπει να γίνονται πάνω σε indexes.

Γιατί το λες αυτό ; Υπάρχει περίπτωση να υπάρχει κάποιο groupid σε κάποιο row του members χωρίς να υπάρχει στον πίνακα group; Λογικά δεν θα έπρεπε να υπάρχει τέτοια περίπτωση .
Ναι, δεν υπάρχει τέτοια περίπτωση. Το συγκεκριμένο join το έκανα γιατί στο πραγματικό πρόβλημα, χρειάζομαι και τα δεδομένα από κάποια columns του group, οπότε τον σύνδεσα με αυτό τον τρόπο, και επίσης όταν έγραφα το απλοποιημένο πρόβλημα εδώ, δεν μου πέρασε από το μυαλό να κάνω join τον announcements με τον members. :pint:

Ευχαριστώ, θα χρησιμοποιήσω τη λύση σου!

Απάντηση

Επιστροφή στο “PHP Προγραμματισμός”

Μέλη σε σύνδεση

Μέλη σε αυτήν τη Δ. Συζήτηση: Δεν υπάρχουν εγγεγραμμένα μέλη και 3 επισκέπτες