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

Custom Sort Php & Mysql


iphotographer

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

Καλησπέρα.

Καλησπερα στην ομαδα. Εχω φτιαξει μια σελιδα με codeigniter οπου ο χρηστης κανει καποιες καταχωρησεις.
Επειδη θα το κανω πρωτη φορα, έχει κολλήσει το μυαλό μου πως θα μπορούσα να κάνω να μπορεί  να σορτάρει ο χρήστης τις καταχωρήσεις του. Έχω ψάξει άπειρες σελίδες στο google αλλά όλες είναι για order_by id, order_by title κλπ. Ξέρω οτί έτσι πρέπει να γίνει και στην δική μου περίπτωση. Δηλαδή έχω φτιαξει και ένα πεδίο στο πίνακα Listings της βάσης με τίτλο listing_order και με default τιμή την 0. 

Οπότε εμφανίζω την λίστα του κάθε χρήστη με 1ο κριτήριο order το listing_order ASC και 2ο κριτήριο (αν τα listing_order είναι ίδια) το id ASC.  

Εστω λοιπον οτι ο πίνακας μου είναι
id  | title        | listing_order
1   | listing-1 | 0
2   | listing-2 | 0
3   | listing-3 | 0
4   | listing-4 | 0
αν εγώ θέλω να κάνω το listing-2 να πάει στην 1η θέση θα πρέπει το listing_order να γίνει -1 σωστά? Αν όμως θέλω το listing-4 να πάει μία θέση επάνω τότε θα γίνει και αυτό -1 αρα τελικά θα πάει 2ο.
 
Δηλαδή από ότι αντιλαμβάνομαι, αν εγώ πατήσω το πάνω βελάκι στην καταχώρηση (πχ. listing-3) τότε το πεδίο listing|_order θα πρέπει να πάρει μια τιμή = παλιά τιμή - 1 σωστά? Αλλά έτσι δεν δουλεύει σωστά, άρα θα πρέπει με κάποιο τρόπο σε κάθε αλλαγή, να αλλάζουν απο την αρχή όλα τα listing_order των καταχωρήσεων. 
 
Παιδιά αν τα έγραψα μπερδεμένα, συγνώμη, αλλά τα έγραψα όσο καλύτερα μπορούσα.
Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Δημοσ. (επεξεργασμένο)
26 λεπτά πριν, papmel είπε

Στο Listing_order Θα εχεις τιμες 100,200,300,400,500,600 κλπ ετσι θα κανεις Sorting.
ποιος σου ειπε οτι οι τιμες ειναι μονο 0 και -1 ? :)))))0
 

To 0 και το -1 πρόεκυψε οπως εθεσα το παραδειγμα. Εγω το είχα στο μυαλό μου με τιμές .........-5,-4,-3,-2,-1,0,1,2,3,4,5...........

Και με την λύση την δική σου πες οτι ήταν έτσι.

1   | listing-1 | 100
2   | listing-2 | 200
3   | listing-3 | 300
4   | listing-4 | 400
5  | listing-5 | 500
6   | listing-6 | 600
7   | listing-7 | 700
 
τι θα πρέπει να κάνω στο  listing 6 ασ πούμε να πάει πάνω από το 5? Να αφαιρέσω κάτι από 1 έως 100? Αν αφαιρέσω πχ 50 τότε θα γίνει 550 οπότε πάλι κάτω από 5 θα είναι. Αν αφαιρέσω πχ 100 τότε θα γίνει 500 οπότε πάλι κάτω από 5 θα είναι αφού θα έχουν το ίδιο listing_order 500.
 
Αν αφαιρέσω κάτι πάνω από 100, πχ 150, τότε θα γίνει το listing_order 450. Θα δουλέψει προς στιγμήν, αν πατήσει ο χρήστης να ανεβει πιο πάνω, τότε στο 2ο κλικ θα γίνει 300 αρά σωστά θα μπει στην 4 θέση, αλλά αν ο χρήστης πατήσει άλλη μια φορά για να το πάει στην 3 θέση, τότε το listing_order θα γίνει 150 οπότε θα γίνει 2ο.
 
Αυτό που μπορώ να φανταστώ σαν λύση, είναι κάπως με μια array να τραβάω όλα τα listing_orders και με το κλικ, κάπως να ξαναμοιράζονται οι τιμές στα listings. Δεν το έχω εμπεδώσει καλά όμως στο μυαλό μου...

 

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

Δημοσ. (επεξεργασμένο)
10 ώρες πριν, iphotographer είπε

To 0 και το -1 πρόεκυψε οπως εθεσα το παραδειγμα. Εγω το είχα στο μυαλό μου με τιμές .........-5,-4,-3,-2,-1,0,1,2,3,4,5...........

Και με την λύση την δική σου πες οτι ήταν έτσι.

1   | listing-1 | 100
2   | listing-2 | 200
3   | listing-3 | 300
4   | listing-4 | 400
5  | listing-5 | 500
6   | listing-6 | 600
7   | listing-7 | 700
 
τι θα πρέπει να κάνω στο  listing 6 ασ πούμε να πάει πάνω από το 5? Να αφαιρέσω κάτι από 1 έως 100? Αν αφαιρέσω πχ 50 τότε θα γίνει 550 οπότε πάλι κάτω από 5 θα είναι. Αν αφαιρέσω πχ 100 τότε θα γίνει 500 οπότε πάλι κάτω από 5 θα είναι αφού θα έχουν το ίδιο listing_order 500.
 
Αν αφαιρέσω κάτι πάνω από 100, πχ 150, τότε θα γίνει το listing_order 450. Θα δουλέψει προς στιγμήν, αν πατήσει ο χρήστης να ανεβει πιο πάνω, τότε στο 2ο κλικ θα γίνει 300 αρά σωστά θα μπει στην 4 θέση, αλλά αν ο χρήστης πατήσει άλλη μια φορά για να το πάει στην 3 θέση, τότε το listing_order θα γίνει 150 οπότε θα γίνει 2ο.
 
Αυτό που μπορώ να φανταστώ σαν λύση, είναι κάπως με μια array να τραβάω όλα τα listing_orders και με το κλικ, κάπως να ξαναμοιράζονται οι τιμές στα listings. Δεν το έχω εμπεδώσει καλά όμως στο μυαλό μου...

 

Μαλιστα τωρα καταλαβα τι ζητας με καθε κλικ να ανεβαζει επανω  την καταχώρηση.
Αυτο που ζητας Γινετε ως εξης.

Εστω τα orders
10
20
30
40
50
60

ας πουμε οτι κανει κλικ στο 50 τοτε το 50 πρεπει να παει πανω απο το 40. 
Ε τι πιο απλο κανεις REPLACE το listing order toy 40 με του  50, και του 50 με το 40
Αν ξαναπατησει παλι το ιδιο κοκ.










 

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

39 λεπτά πριν, papmel είπε

Μαλιστα τωρα καταλαβα τι ζητας με καθε κλικ να ανεβαζει επανω  την καταχώρηση.
Αυτο που ζητας Γινετε ως εξης.

Εστω τα orders
10
20
30
40
50
60

ας πουμε οτι κανει κλικ στο 50 τοτε το 50 πρεπει να παει πανω απο το 40. 
Ε τι πιο απλο κανεις REPLACE το listing order toy 40 με του  50, και του 50 με το 40
Αν ξαναπατησει παλι το ιδιο κοκ.
 

Ναι έχεις δίκιο. Κόλλησε το μυαλό μου και δεν μπορούσα να το σκεφτώ 😅

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

  • 2 εβδομάδες αργότερα...
Δημοσ. (επεξεργασμένο)

Καλησπέρα. Για να μην ανοίγω νέο νήμα μιας και οι ερωτήσεις αφορούν την mysql μου.

α) Έχω φτιάξει έναν πίνακα που περνάω τις αποστολές των δεμάτων μου. με A/A, κωδικό αποστολής, ποσό, όνομα κλπ και ένα πεδίο status το οποίο είναι default = 0 που σημαίνει οτι απλά έχει αποσταλεί το δέμα. Από το excel μου, τα κάνω csv και μετά τα περνάω στην βάση. Από εκεί και πέρα κάνω διάφορους υπολογισμούς, σύνολα, αριθμό δεμάτων κλπ. Επειδή όμως οι αποστολές είναι εκατοντάδες και πάρα πολλά τα csv, φοβάμαι πολλές φορές μην διπλοπεράσω κάποια. Υπάρχει τρόπος κατα το insert στην λούπα , αν βρεθεί ίδιος αριθμός αποστολής απλά να παρακαμφθει το insert? 

Ο κώδικάς μου μέχρι στιγμής είναι:

foreach($apostoles as $apostoli){
        
        $row = explode(";",$apostoli);        
        $data = array(
        'ar_apostolis' => $row[0],
        'poso' => $row[1],
        'date' => $row[2],
        'name' => $row[3]
        );   
        $this->db->insert('apostoles', $data);
}

β) Έχω φτιάξει ένα πίνακα pliromes που όταν μου έρχεται το excel από courier, το κάνω csv και το περνάω στο πίνακα. Μετά ξεκινάω μια λουπα, που για κάθε row του πίνακα pliromes αν το πεδίο pliromes.ar_apostolis είναι ίδιο με το πεδίο apostoles.ar_apostolis, κάνει update την συγκεκριμένη εγγραφή και αλλάζει το πεδίο apostoles.status από 0 σε 1 που εξηγώ παραπάνω. Για να μην βάζω στην λούπα ΟΛΟ τον πίνακα των πληρωμών, έχω βάλει σαν φίλτρο τις πληρωμές που εισήχθησαν στον πίνακα την τρέχουσα μέρα. Αυτό με βοήθησε πάρα πολύ γιατί δεν ψάχνει από τις πληρωμές που ανέβασα και εχθές πχ., αλλά μόνο τις σημερινές. Βέβαια ακόμα αργεί αυτή η φάση γιατί ψάχνει την κάθε πληρωμή σε ΟΛΟ τον πίνακα αποστολών όμως. Υπάρχει κάποια ιδέα για καλύτερη βελτιστοποίηση?

Ο κώδικας προσθήκης πληρωμών είναι:

foreach($pliromes as $pliromi){
        
        $row = explode(";",$pliromi);

        $data = array(
        'ar_apostolis' => $row[0],
        'poso' => $row[1],
        'date' => $row[2],
        'name' => $row[3],
        'insert_date' => date("Y-m-d")
        );      
        $this->db->insert('pliromes', $data);
    }
    
    $this->db->select('*');
    $this->db->from('pliromes');
    $this->db->where('insert_date', date("Y-m-d"));
    $result = $this->db->get();
    $pliromes = $result->result();   
        
    foreach($pliromescheck as $pliromicheck){        
    $data = array('status' =>  1);
    $this->db->where('ar_apostolis', $pliromicheck->ar_apostolis);
    $update = $this->db->update('apostoles', $data);
    }

Υ.Γ. Η πίνακες μέχρι στιγμής έχουν χιλιάδες αποστολές και πληρωμές και περνιούνται καθημερινά εκατοντάδες αποστολές και πληρωμές. Οπότε σκεφθείτε κάθε φορά που περνάω 200 πληρωμές να πρέπει να κάνει 200 λούπες και σε κάθε λούπα να πρέπει να τσεκάρει 100.000 αποστολές για να κάνει match τον αριθμό αποστολής και να αλλάξει το status.  Μια ιδέα που μου ήρθε ήταν να βάλω ένα εξτρα where οπού το status είναι 0. Οπότε να μην ξαναψάχνει αυτά που ήδη είναι πληρωμένα. Επειδή όμως δεν μπορώ να κατάλαβω τους χρόνους, πιστεύεται οτι θα βοηθήσει κάπου αυτό?

Δηλαδή ο κώδικας από:

foreach($pliromescheck as $pliromicheck){        
    $data = array('status' =>  1);
    $this->db->where('ar_apostolis', $pliromicheck->ar_apostolis);
    $update = $this->db->update('apostoles', $data);
    }

να γίνει:

foreach($pliromescheck as $pliromicheck){        
    $data = array('status' =>  1);
    $this->db->where('ar_apostolis', $pliromicheck->ar_apostolis);
	$this->db->where('status', 0);
    $update = $this->db->update('apostoles', $data);
    }

 

 

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

Στην mysql βλέπω ότι υπάρχει το insert ignore απλά απ' ότι καταλαβαίνω θα πρέπει να είναι unique (λογικά και not null) η στήλη ar_apostolis για να παίξει σωστά

Σε sql server θα μπορούσες αυτό να το κάνεις εύκολα με merge into οπότε ψάξε μήπως υπάρχει κάτι αντίστοιχο σε mysql ή αν ξέρει κάποιος εδώ στο forum να μας πει

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

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

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

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

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

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

Σύνδεση

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

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