Duplicate Values into Text Field

Συζητήσεις για την βάση δεδομένων MySQL και το phpMyAdmin

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

Απάντηση
Άβαταρ μέλους
Risk
Δημοσιεύσεις: 319
Εγγραφή: 02 Μάιος 2006 01:16
Τοποθεσία: Κάπου εδώ γύρω...
Επικοινωνία:

Duplicate Values into Text Field

Δημοσίευση από Risk » 22 Ιούλ 2008 16:27

'Οπως υποδηλωνεται και από τον αγγλικό τίτλο, σε ένα πεδίο ενός πίνακα που έχω, το οποίο πεδίο είναι τύπου text, υπάρχουν μέσα διπλοεγγραφές. Αυτές έχουν προέλθει από μια παλιά βάση και τον λόγο να σας πω την αλήθεια δεν το ξέρω.

Το θέμα όμως τώρα είναι πως φτιάχνω μια εφαρμογή χρησιμοποιώντας υποχρεωτικά αυτή την βάση και από την οποία θα πρέπει να "καθαρίσω" τις διπλοεγγραφές. Τι είναι αυτές οι διπλοεγγραφές; Λοιπόν π.χ. 1)στο πεδίο workdone, στην εγγραφή με id=4 υπάρχει τρεις φορές ο αριθμός 678 2) στο πεδίο πάλι workdone, στην εγγραφή με id=20 υπάρχει 2 φορές ο αριθμός 165 κλπ.

Αυτό που θα ήθελα να σας ρωτήσω είναι αν υπάρχει κάποιο sql query που να κόβει τις διπλοεγγραφές από text πεδία;;;; Αν δεν υπάρχει η λύση που προτείνετε είναι ένα hand made php script;;;

Ευχαριστώ.
Εικόνα

Άβαταρ μέλους
soteres2002
S. & H. Moderator
Δημοσιεύσεις: 1524
Εγγραφή: 05 Μαρ 2004 22:17
Τοποθεσία: Ιωάννινα

Duplicate Values into Text Field

Δημοσίευση από soteres2002 » 22 Ιούλ 2008 16:40

όπως ζητάς τις εγγραφές αυτή τη στιγμή με κάποιο SELECT [...] statement θα αντικαταστήσεις το select me select distinct. Αυτό θα σου λύσει το "πρόβλημά" σου.

Άβαταρ μέλους
Risk
Δημοσιεύσεις: 319
Εγγραφή: 02 Μάιος 2006 01:16
Τοποθεσία: Κάπου εδώ γύρω...
Επικοινωνία:

Duplicate Values into Text Field

Δημοσίευση από Risk » 23 Ιούλ 2008 11:21

Φίλε soteres2002,
Σε ευχαριστώ πολύ για την απάντησή σου. Το select distinct είναι φυσικά old time classic εντολή, το δοκίμασα και εγώ πρώτο,πρώτο, αλλά το πεδίο στο οποίο θέλω να κόβονται οι διπλοεγγραφές είναι text.

Έχω καταλήξει στο συμπέρασμα από χτες πως μάλλον με sql query δεν θα το καταφέρω αυτό και πως θα πρέπει να δημιουργήσω κάποιο php script;;;

Μήπως κανείς έχει κάποια άλλη ιδέα;;;
Εικόνα

Άβαταρ μέλους
soteres2002
S. & H. Moderator
Δημοσιεύσεις: 1524
Εγγραφή: 05 Μαρ 2004 22:17
Τοποθεσία: Ιωάννινα

Duplicate Values into Text Field

Δημοσίευση από soteres2002 » 23 Ιούλ 2008 12:28

Risk, έχεις εκτελέσει σωστά το query με το distinct clause; Σε ένα πινακάκι με ένα unique identifier και ένα πεδίο text έχω 2 μόνο διπλοεγγραφές.

Δίνοντας "SELECT DISTINCT * FROM test;" παίρνω και τις 2 εγγραφές:

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

mysql> select distinct * from test;
+----+--------+
| id | txt    |
+----+--------+
|  1 | abc123 |
|  2 | abc123 |
+----+--------+
2 rows in set (0.00 sec)
Μετασχηματίζωντας το προηγούμενο ερώτημα σε "SELECT DISTINCT txt FROM test;" παίρνω:

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

mysql> select distinct txt from test;
+--------+
| txt    |
+--------+
| abc123 |
+--------+
1 row in set (0.00 sec)
Εναλλακτικά μπορείς να μετασχηματίσεις το 2ο ερώτημα σε

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

select distinct * from test group by txt;
ώστε να διατηρήσεις το ίδιο αποτέλεσμα από το προηγούμενο παράδειγμα.


Νομίζω πως έχεις υποπέσει σε αυτό το τερτίπι. Το version string της ΒΔ που δοκίμασα είναι mysql Ver 14.12 Distrib 5.0.45, for unknown-linux-gnu (x86_64) using readline 5.0 και ο πίνακας είναι innodb και όχι myisam.

REMIXED
Προγραμματιστική συμβουλή: είναι πολλές φορές καλύτερο να αναθέτεις τη δουλεία της εξόρυξης (you name it) στον database server παρά να κάνεις local processing. Μπορεί να είναι από δύσκολο έως πολύ αργό και ίσως όχι πάντα σωστό αποτέλεσμα. Σε έναν πίνακα με χιλιάδες εγγραφές η διαλογή μπορεί να παίρνει αρκετά seconds για να σου δώσει τα αποτελέσματα που θες.
Τελευταία επεξεργασία από το μέλος soteres2002 την 23 Ιούλ 2008 13:56, έχει επεξεργασθεί 1 φορά συνολικά.

Άβαταρ μέλους
cherouvim
Script Master
Δημοσιεύσεις: 3137
Εγγραφή: 13 Ιούλ 2005 22:56
Τοποθεσία: Athens, Greece
Επικοινωνία:

Duplicate Values into Text Field

Δημοσίευση από cherouvim » 23 Ιούλ 2008 13:02

soteres2002 έγραψε:Προγραμματιστική συμβουλή: είναι καλύτερο να αναθέτεις τη δουλεία της εξόρυξης (you name it) στον database server παρά να κάνεις local processing. Μπορεί να είναι από δύσκολο έως πολύ αργό και ίσως όχι πάντα σωστό αποτέλεσμα. Σε έναν πίνακα με χιλιάδες εγγραφές η διαλογή μπορεί να παίρνει αρκετά seconds για να σου δώσει τα αποτελέσματα που θες.
Καλή συμβουλή, αλλά δεν είναι τυφλός κανόνας αυτός.
Πχ δεν θέλω να γράψω ένα stored procedure για να μου επιστρέψει τη δενδρική δομή των categories, αλλά θέλω να το κάνω αυτό στο application layer.

Άβαταρ μέλους
soteres2002
S. & H. Moderator
Δημοσιεύσεις: 1524
Εγγραφή: 05 Μαρ 2004 22:17
Τοποθεσία: Ιωάννινα

Duplicate Values into Text Field

Δημοσίευση από soteres2002 » 23 Ιούλ 2008 13:13

Ναι, δεν είναι τυφλός κανόνας. Μερικές φορές δεν βολέβει κι όλας, αναφορικά με το παραδειγμα.

Άβαταρ μέλους
Risk
Δημοσιεύσεις: 319
Εγγραφή: 02 Μάιος 2006 01:16
Τοποθεσία: Κάπου εδώ γύρω...
Επικοινωνία:

Duplicate Values into Text Field

Δημοσίευση από Risk » 31 Ιούλ 2008 17:37

Συγνώμη για την καθυστερημένη απάντηση.

Πολύ καλή η επεξήγησή σου φίλε sotares, μόνο που η δική μου περίπτωση όπως είχα αναφέρει και στην αρχή ήταν λίγο διαφορετική:

id=1 --> txt = abc123, abc123, 1234, 1234

Είχα δηλαδή μέσα στην ίδια εγγραφή (id=1) πολλές φορές την ίδια τιμή. Στην περίπτωση αυτή λοιπόν δεν μπορεί να εφαρμοστεί το distinct. Αυτό που έκανα, ήταν να δημιουργήσω ένα php script το οποίο να κόβει τις διπλοεγγραφές.

Καλο καλοκαίρι σε όλους!!!
Εικόνα

Άβαταρ μέλους
soteres2002
S. & H. Moderator
Δημοσιεύσεις: 1524
Εγγραφή: 05 Μαρ 2004 22:17
Τοποθεσία: Ιωάννινα

Duplicate Values into Text Field

Δημοσίευση από soteres2002 » 01 Αύγ 2008 01:14

Αν έχεις σχετικά λίγες εγγραφές σε αυτό τον πίνακα το καλύτερο που έχεις να κάνεις είναι να αριθμήσεις από την αρχή το πεδίο id ξεκινώντας από την τιμή 0 (1, 2, 3, κτλ μέχρι την τελευταία εγγραφή) και στη συνέχεια να μετατρέπεις το πεδίο id σε πρωτεύων κλειδί (primary key) με αυτόματη άυξηση τιμής (auto increment, ώστε να βρίσκει η ΒΔ από μόνη της το επόμενο id που θα βάλει (δλδ id_neo = id_prin + 1)).

Με περισσότερες λεπτομέριες...
Eδώ υπάρχει γενικώς πρόβλημα εκτός από τις διπλοεγγραφές που αναφέρεις, και εφόσον η ΒΔ σου δίνει τη δυνατότητα να χρησιμοποιήσεις κάποια χαρακτηριστικά αξίζει να την τροποποιήσεις ώστε να είναι εύκολα μεταφέρσιμη σε άλλους προγραμαμτιστές. Ασχέτως τι προηγήθηκε με αυτή τη βάση και ποιος την σχεδίασε αρχικά, το πεδιο id πρέπει να είναι μοναδικό ασχέτως άν 2 ή περισσότερες εγγραφές έχουν τα ίδια δεδομένα και αυτές πρέπει να έχουν διαφορετικό id (όπως είπα και πριν).

Σύμφωνα με αυτά που λές, το πεδίο id σίγουρα δεν είναι πρωτεύων και δεν έχει την ιδιότητα auto increment ώστε σε κάθε νέα εισαγωγή να μπαίνει μια μοναδική εγγραφή που να έχει ένα πεδίο που να την κάνει να ξεχωρίζει από τις άλλες εγγραφές (ώστε να δουλεύει και το distinct).

Επίσης, υπάρχει και το άλλο ζόρι: πώς εσύ ξέρεις τι id πρέπει να μπεί την επόμενη φορά. Αυτό βέβαια λύνεται αλλά με ανορθόδοξο τρόπο, και μάλλον "ΛΑΘΟΣ" εφόσον η ΒΔ σου προσφέρει ήδη βασικές ιδιότητες για να σε απαλλάξει από ζητήματα που πρέπει να αφορούν άμεσα την ΒΔ χωρίς να μπλέκεσαι εσύ με κώδικα, και που διαφορετικά θα έλυνες εσύ προγραμματιστικά (όπως δλδ κάνεις τώρα) από τον κώδικά σου.

Το id πρέπει βασικά να είναι int, not null, primary key, και να έχει ακόμα την ιδιότητα auto_increment. Oι αλλαγές αυτές μπορούν να γίνουν έυκολα μέσω phpmyadmin, διαφορετικά όμως γίνονται και μέσω κονσόλας.

Απάντηση

Επιστροφή στο “MySQL”

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

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