gotham7878 Δημοσ. 2 Αυγούστου 2020 Δημοσ. 2 Αυγούστου 2020 Καλησπέρα. Σε codigniter τραβάω δεδομένα από την βάση σε ένα πίνακα με where. πχ $this->db->select('*'); $this->db->from('jobs'); $result = $this->db->get(); όλα καλά μέχρι εδώ. Εμφανίζονται μια χαρά. Μέσα στο πίνακα των jobs έχω και το user_id που έχει ποστάρει την δουλειά. Δηλαδή ο πίνακας των jobs έχει περίπου την δομή: | jobs_id | jobs_user_id | jobs_title | jobs_description ----------------------------------------------------------- Τώρα στον πίνακα των users έχω και ένα column που γράφω αν ο χρήστης είναι pro ή όχι με τιμές 0 και 1. έχω φτιάξει και μια function στο helper που απλα με το id του χρήστη, τσεκάρω αν είναι pro ή όχι. Δηλαδή check_user($id) και επιστρέφει τιμές true ή false. ----------------------------------------------------------- Ποιο είναι το πρόβλημα μου. Στο παραπάνω select μπορώ να είσαγω κάπως την παράμετρο που παίρνω από το helper? Δηλαδή θέλω να εμφανίσω μόνο τα αποτελέσματα των pro μελών.? Πως μπορώ να το κάνω. Μπορώ να το κάνω χωρίς να χρειαστεί join κλπ? ----------------------------------------------------------- Δηλαδή με ψευτοκώδικα (ξέρω οτι δεν δουλευει έτσι), θέλω να το κάνω να δουλέψει κάπως έτσι. $this->db->select('*'); $this->db->from('jobs'); $this->where(check_user(jobs_user_id) == TRUE); $result = $this->db->get(); Ευχαριστώ.
dewn735 Δημοσ. 3 Αυγούστου 2020 Δημοσ. 3 Αυγούστου 2020 (επεξεργασμένο) To $this->db κατασκευάζει query για τη mysql, οπότε αυτό που προσπαθείς απλά, δε γίνεται. Υπάρχει λόγος που δεν το κάνεις με JOIN στη βάση; Εάν ντε και καλά δε θες με Join, θα πρέπει πρώτα να τραβήξεις τα αποτελέσματα από τη βάση και μετά να τα περάσεςι από το check_user() Επεξ/σία 3 Αυγούστου 2020 από dewn735
elvizakos Δημοσ. 4 Αυγούστου 2020 Δημοσ. 4 Αυγούστου 2020 Γενικά ο standar τρόπος είναι με JOIN: $this->db->query("SELECT * FROM jobs INNER JOIN users ON jobs.job_user_id = users.user_id WHERE users.user_pro = 1;"); Αυτό θα σου επιστρέψει τις στήλες και των δύο πινάκων. Οπότε στο "SELECT *" ίσως θα πρέπει να αντικαταστήσεις το * με τα ονόματα των στηλών που θέλεις. Ένας άλλος τρόπος να το κάνεις είναι και αυτός: $this->db->query("SELECT * FROM jobs WHERE 1 = (SELECT user_pro FROM users WHERE users.user_id = jobs.job_user_id LIMIT 0, 1 )"); Αυτό όμως μπορεί να είναι αργό και ιδικά σε μεγάλους πίνακες.
pmav99 Δημοσ. 4 Αυγούστου 2020 Δημοσ. 4 Αυγούστου 2020 To σωστό είναι να κάνεις JOIN με τον πίνακα όπου κρατάς την πληροφορία σχετικά με το αν ο χρήστης είναι pro ή όχι. 1
gotham7878 Δημοσ. 6 Αυγούστου 2020 Μέλος Δημοσ. 6 Αυγούστου 2020 (επεξεργασμένο) Καλημέρα. Εχθές δοκίμασα τις λύσεις που προτείνατε με join και τα καταφερα. (Γενικά φοβάμαι το JOIN κάπως. Με μπερδέυει). $this->db->select('*', 'user_plan'); $this->db->from('jobs'); $this->db->join('users', 'users.user_id = jobs.jobs_user_id'); $this->db->where('user_plan', 1) Έτσι δούλεψε μια χαρά. Μία τελευταία ερώτηση (δοκίμασα κάτι και δεν δουλεψε) Έχω και ένα πίνακα reviews ο οποίος έχει τα πεδία. review_id | review_user_id | review_value (παίρνει τιμές από 1-10 που είναι και καλά η βαθμολογία) Στον οποίο θέλω και αυτόν να τον βάλω με join στο παραπάνω αλλά όχι απλά τα πεδία όπως έκανα και με το membership του χρήστη. Θέλω να πάρω ένα πεδίο με το αριθμό των rows που έχει ο κάθε χρήστης και το μέσο όρο αυτών. Δηλαδή στον παραπάνω κώδικα θέλω να εισάγω κάτι σαν $this->db->select('*', 'user_plan', 'COUNT(reviews) AS countreviews', '?(reviews) AS Mesosoros'); γιατί με αυτές τις τιμές θέλω να sortaρω μετά στο order_by. Πως τελικά έκανα το παραπάνω... $this->db->select('*', 'user_plan'); $this->db->from('jobs'); $this->db->join('users', 'users.user_id = jobs.jobs_user_id'); $this->db->where('user_plan', 1) Αν κάποιος επιλέξει ταξινόμηση ανα περισσότερα reviews να γίνεται το query $this->db->order_by("countreviews desc"); Αν κάποιος επιλέξει ταξινόμηση με την μεγαλύτερη βαθμολογία να γίνεται το query $this->db->order_by("Mesosoros asc"); Δηλαδή δεν ξέρω τι πρέπει να βάλω εκεί που έιναι τα κόκκινα γράμματα. Επεξ/σία 6 Αυγούστου 2020 από gotham7878
dewn735 Δημοσ. 6 Αυγούστου 2020 Δημοσ. 6 Αυγούστου 2020 (επεξεργασμένο) https://codeigniter.com/userguide3/database/query_builder.html#ordering-results $this->db->select('*', 'user_plan'); $this->db->from('jobs'); $this->db->join('users', 'users.user_id = jobs.jobs_user_id'); $this->db->where('user_plan', 1); $this->db->order_by('mesosoros'); Ίσως θα έπρεπε πρώτα να ξεκαθαρίσεις στο μυαλό σου το πως θα είναι το query και μετά το πως θα το ζητήσεις από το codeigniter: $order_by=($this->input->get("order_by") ? $this->input->get("order_by") : "mesosoros"); $query="SELECT * FROM users LEFT JOIN jobs on jobs.user_id = users.id LEFT JOIN reviews on reviews.user_id = users.id WHERE users.user_plan= 1 ORDER BY ".$order_by." ASC"; $this->db->query($query); Επεξ/σία 6 Αυγούστου 2020 από dewn735
gotham7878 Δημοσ. 6 Αυγούστου 2020 Μέλος Δημοσ. 6 Αυγούστου 2020 (επεξεργασμένο) 2 ώρες πριν, dewn735 είπε https://codeigniter.com/userguide3/database/query_builder.html#ordering-results $order_by=($this->input->get("order_by") ? $this->input->get("order_by") : "mesosoros"); $query="SELECT * FROM users LEFT JOIN jobs on jobs.user_id = users.id LEFT JOIN reviews on reviews.user_id = users.id WHERE users.user_plan= 1 ORDER BY ".$order_by." ASC"; $this->db->query($query); Δεν μπορώ να καταλάβω που ακριβώς γίνεται ο υπολογισμός του μέσου όρους και το σύνολο των reviews? 😞 Επεξ/σία 6 Αυγούστου 2020 από gotham7878
dewn735 Δημοσ. 6 Αυγούστου 2020 Δημοσ. 6 Αυγούστου 2020 Λογικό είναι, αφού άλλο πράμμα ρώτησες... Quote Αν κάποιος επιλέξει ταξινόμηση ανα περισσότερα reviews να γίνεται το query $this->db->order_by("countreviews desc"); Αν κάποιος επιλέξει ταξινόμηση με την μεγαλύτερη βαθμολογία να γίνεται το query $this->db->order_by("Mesosoros asc");
elvizakos Δημοσ. 7 Αυγούστου 2020 Δημοσ. 7 Αυγούστου 2020 Εκεί που είναι το ερωτηματικό,βάλε AVG (το όνομα της συνάρτησης στη mysql για επιστροφή του μέσου όρου).
gotham7878 Δημοσ. 8 Αυγούστου 2020 Μέλος Δημοσ. 8 Αυγούστου 2020 22 ώρες πριν, elvizakos είπε Εκεί που είναι το ερωτηματικό,βάλε AVG (το όνομα της συνάρτησης στη mysql για επιστροφή του μέσου όρου). Δεν δουλεύει
dewn735 Δημοσ. 9 Αυγούστου 2020 Δημοσ. 9 Αυγούστου 2020 Τι δε δουλεύει; Σου βγάζει σφάλμα; Σου βγάζει λάθος αποτέλεσμα; το $this->db->last_query() τι σου επιστρέφει;
elvizakos Δημοσ. 10 Αυγούστου 2020 Δημοσ. 10 Αυγούστου 2020 Στις 6/8/2020 στις 10:52 ΠΜ, gotham7878 είπε Αν κάποιος επιλέξει ταξινόμηση ανα περισσότερα reviews να γίνεται το query $this->db->order_by("countreviews desc"); Αν κάποιος επιλέξει ταξινόμηση με την μεγαλύτερη βαθμολογία να γίνεται το query $this->db->order_by("Mesosoros asc"); Κάτι δεν έχεις καταλάβει εδώ βασικά. Ή βασικά έχεις μπερδευτεί.Χρειάζεσαι "ORDER BY reviews ASC" ή "ORDER BY reviews DESC". Το COUNT και AVG δεν σου χρειάζονται εδώ (ή ίσως εγώ δεν έχω καταλάβει τι θέλεις να κάνεις).
gotham7878 Δημοσ. 20 Αυγούστου 2020 Μέλος Δημοσ. 20 Αυγούστου 2020 Στις 10/8/2020 στις 1:58 ΠΜ, elvizakos είπε Κάτι δεν έχεις καταλάβει εδώ βασικά. Ή βασικά έχεις μπερδευτεί.Χρειάζεσαι "ORDER BY reviews ASC" ή "ORDER BY reviews DESC". Το COUNT και AVG δεν σου χρειάζονται εδώ (ή ίσως εγώ δεν έχω καταλάβει τι θέλεις να κάνεις). Καλησπέρα. Το reviews δεν είναι πεδίο του πίνακα των καταχωρήσεων. Αν ήταν έτσι στέκει οπως το λες* Τα reviews είναι από μόνα τους ένας πίνακας . Οταν λοιπόν θέλω να βρω πόσα reviews έχει μια καταχχώρηση και τι βαθμολογία έχει, έκανα 2 function με παράμετρο το review_listing_id οπότε η 1η function κάνει select τον σύνολο των rows που έχουν σαν review_listing_id το id της καταχώρησης και μου επιστρέφει πχ 35 αν έχουν γίνει 35 reviews για αυτή την καταχώρηση. και η 2η function κανει κάνει άρθροισμα όλα τα review_values από όλα τα rows που αφορούν την συγκεκριμένη καταχώρηση και το διαιρεί με το αποτέλεσμα της function 1. Αυτά δουλεύουν. Πως θα κάνω το σορτάρισμα δεν ήξερα. *Τελικά έφτιαξα 2 πεδία στο πίνακα των καταχωρήσεων, ένα για μέσο όρο και ένα για συνολο reviews και όταν προστεθεται ή αφαιρείται ένα review ενημερώνονται με function αυτα τα πεδία. Οπότε τώρα ναι, σορτάρω όπως είπες!!!
Προτεινόμενες αναρτήσεις
Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε
Πρέπει να είστε μέλος για να αφήσετε σχόλιο
Δημιουργία λογαριασμού
Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!
Δημιουργία νέου λογαριασμούΣύνδεση
Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.
Συνδεθείτε τώρα