philos Δημοσ. 22 Οκτωβρίου 2015 Δημοσ. 22 Οκτωβρίου 2015 Καλημέρα παιδιά! Έχω μια ερώτηση πάνω σε μια WHERE ενός MySQL ερωτήματος. Λοιπόν, έχουμε τον πίνακα user ο οποίος μεταξύ άλλων έχει και τα ακόλουθα columns: usergroupid (παίρνει integer τιμές) membergroupids (παίρνει κείμενο και συγκεκριμένα δέχεται τα usergroupids των δευτερευόντων usergroups που ανήκει ο χρήστης, χωρισμένα με κόμμα, πχ: 3,6,7) Έστω οτι έχουμε έναν php array ($approved) με κάποια usergroup ids. Θέλω λοιπόν να επιλέξω τους χρήστες που ανήκουν σε αυτά τα usergroups, οπότε βάζω ένα: WHERE user.usergroupid IN (". implode(',', $approved) .") ... πως μπορώ όμως να επιλέξω και τους χρήστες που ανήκουν στα $approved ως δευτερεύων usergroup? Δε ξέρω πως να το χειριστώ καθώς το membergroupids δεν είναι integer, αλλά τα ids χωρισμένα με κόμμα.
exarhis Δημοσ. 22 Οκτωβρίου 2015 Δημοσ. 22 Οκτωβρίου 2015 Καλημέρα. Μπορείς να χρησιμοποιήσεις Site: wildcards
philos Δημοσ. 22 Οκτωβρίου 2015 Μέλος Δημοσ. 22 Οκτωβρίου 2015 Εννοείς το LIKE; Και πως συντάσσεται στη προκειμένη για τον συγκεκριμένο array με usergroupids;
exarhis Δημοσ. 22 Οκτωβρίου 2015 Δημοσ. 22 Οκτωβρίου 2015 πχ στο query : WHERE user.usergroupid IN (". implode(',', $approved) .") AND user.usergroupid = '%,3,%' Αυτό θα επιστρέψει όλες τις καταχωρήσεις που έχουν το ',3,'. Βάζω το , γιατί να μην επιστρέφει το 30 κτλ. Σε αυτή τη περίπτωση τα ids πρέπει να αρχίζουν και να τελειώνουν με ένα κόμμα , Έτσι θα το έκανα εγώ * Σε περίπτωση που ψάχνεις το id 3
defacer Δημοσ. 22 Οκτωβρίου 2015 Δημοσ. 22 Οκτωβρίου 2015 συγκεκριμένα δέχεται τα usergroupids των δευτερευόντων usergroups που ανήκει ο χρήστης, χωρισμένα με κόμμα, πχ: 3,6,7) Αυτό είναι "λάθος" και θα πρέπει να έχεις πάρα μα πάρα πολύ καλό λόγο για να το κάνεις έτσι (φιλοσοφικά το λέω, εφόσον ρωτάς αυτό που ρωτάς είναι σχεδόν αδύνατο να ξέρεις αρκετά για να έχεις τέτοιο λόγο). Οπότε ας ξεκινήσουμε από εκεί: γιατί κολυμπάς κόντρα στο ρεύμα;
philos Δημοσ. 22 Οκτωβρίου 2015 Μέλος Δημοσ. 22 Οκτωβρίου 2015 Ευχαριστώ για τις απαντήσεις παιδιά!Το κατάφερα και με τον ακόλουθο τρόπο: $array = array(12,17);$condition = '';foreach($array as $id){$condition .= " OR FIND_IN_SET(" . $id . ", user.membergroupids)";} WHERE user.usergroupid IN (". implode(',', $approved) .") " . $condition . " defacer, δεν είναι δικός μου ο σχεδιασμός της βάσης δεδομένων. Το συγκεκριμένο πρόβλημα αφορά τον πίνακα user της μηχανής vBulletin, και ασφαλώς δεν με ενδιαφέρει να αλλάξω τη δομή του, αλλά να λύσω το πρόβλημα με τα υπάρχοντα δεδομένα.
defacer Δημοσ. 22 Οκτωβρίου 2015 Δημοσ. 22 Οκτωβρίου 2015 OK τότε. Μια άλλη εναλλακτική που ίσως αξίζει να δοκιμάσεις αν τυχόν αυτό που έχεις είναι πολύ αργό θα ήταν να κάνεις $array = [12,17]; $condition = " user.membergroupids REGEXP (?:\\b|^)(".implode('|', $array).")(?:\\b|$)"; και να το κάνεις OR με ο,τι άλλο έχεις. Και μη ξεχνάς: πάντα με προφυλάξεις. Δε βάζουμε μέσα σε queries παραμέτρους που δεν προέρχονται από την ίδια την εφαρμογή. 1
philos Δημοσ. 23 Οκτωβρίου 2015 Μέλος Δημοσ. 23 Οκτωβρίου 2015 Ευχαριστώ, θα το τσεκάρω σε λίγο και το REGEXP να δω πως λειτουργεί. Άλλο ένα ερωτηματάκι σχετικά με ORDER. Ο πίνακας thread έχει ας πούμε μεταξύ άλλων (threadid, title κτλ), δύο πεδία, το dateline (unix timestamp της ημερομηνίας που έγινε το thread) και το pin_dateline (μια μετέπειτα ημερομηνία, που ο διαχειριστής επέλεξε το θέμα να γίνει pinned). Τρέχω ένα query όπου επιλέγω τα τελευταία threads κάνοντας: ORDER BY thread.dateline DESC Θα ήθελα όμως να βάλω μπροστά όσα θέματα είναι pinned, οπότε κάνω: ORDER BY thread.pin_dateline DESC, thread.dateline DESC Το θέμα: ας πούμε ότι έχουμε 3 θέματα κανονικά: Thread 4 Thread 3 Thread 2 Thread 1 ... κάνω pinned το Thread 3, οπότε το order γίνεται: Thread 3 Thread 4 Thread 2 Thread 1 Το ζητούμενο: αν κάποιος δημιουργήσει νέο θέμα (ας πούμε το Thread 5 και το Thread 6), θα ήθελα να πάνε πιο μπροστά από το pinned Thread 3, γιατί είναι νεότερα: Thread 6 Thread 5 Thread 3 Thread 4 Thread 2 Thread 1 Ουσιαστικά, θέλω τα pinned threads να μην είναι fixed, αλλά να μεταφέρονται προς τα πίσω καθώς νέα θέματα δημιουργούνται. Ψάχνω βασικά λύση σε MySQL αντί να κάνω το order με PHP.
defacer Δημοσ. 23 Οκτωβρίου 2015 Δημοσ. 23 Οκτωβρίου 2015 Σαν ORDER BY GREATEST(dateline, pin_dateline) DESC ακούγεται αυτό. 2
Προτεινόμενες αναρτήσεις
Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε
Πρέπει να είστε μέλος για να αφήσετε σχόλιο
Δημιουργία λογαριασμού
Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!
Δημιουργία νέου λογαριασμούΣύνδεση
Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.
Συνδεθείτε τώρα