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

Where σε results εκτός πίνακα


gotham7878

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

Καλησπέρα.

Σε 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();

Ευχαριστώ.

 

 

 

 

 

 

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Δημοσ. (επεξεργασμένο)

To $this->db κατασκευάζει query για τη mysql, οπότε αυτό που προσπαθείς απλά, δε γίνεται. Υπάρχει λόγος που δεν το κάνεις με JOIN στη βάση;

Εάν ντε και καλά δε θες με Join, θα πρέπει πρώτα να τραβήξεις τα αποτελέσματα από τη βάση και μετά να τα περάσεςι από το check_user()

Επεξ/σία από dewn735
Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Γενικά ο 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 )");

Αυτό όμως μπορεί να είναι αργό και ιδικά σε μεγάλους πίνακες.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Δημοσ. (επεξεργασμένο)

Καλημέρα. Εχθές δοκίμασα τις λύσεις που προτείνατε με 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");

Δηλαδή δεν ξέρω τι πρέπει να βάλω εκεί που έιναι τα κόκκινα γράμματα.

 

 

 

Επεξ/σία από gotham7878
Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Δημοσ. (επεξεργασμένο)

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);

 

Επεξ/σία από dewn735
Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Δημοσ. (επεξεργασμένο)
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? 😞

Επεξ/σία από gotham7878
Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Λογικό είναι, αφού άλλο πράμμα ρώτησες...

Quote

Αν κάποιος επιλέξει ταξινόμηση ανα περισσότερα reviews να γίνεται το query

 $this->db->order_by("countreviews desc");

Αν κάποιος επιλέξει ταξινόμηση με την μεγαλύτερη βαθμολογία να γίνεται το query

 $this->db->order_by("Mesosoros asc");

 

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

22 ώρες πριν, elvizakos είπε

Εκεί που είναι το ερωτηματικό,βάλε AVG (το όνομα της συνάρτησης στη mysql για επιστροφή του μέσου όρου).


Δεν δουλεύει :(

 

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Στις 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 δεν σου χρειάζονται εδώ (ή ίσως εγώ δεν έχω καταλάβει τι θέλεις να κάνεις).

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

  • 2 εβδομάδες αργότερα...
Στις 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 αυτα τα πεδία. Οπότε τώρα ναι, σορτάρω όπως είπες!!!

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

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

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

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

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

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

Σύνδεση

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

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