Delete Duplicate content from mySQL

Σε αυτή την περιοχή μπορείτε να βρείτε ή να αναζητήσετε πληροφορίες σχετικές με την PHP

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

Απάντηση
Άβαταρ μέλους
Basilakis
PHP Moderator
Δημοσιεύσεις: 8574
Εγγραφή: 17 Νοέμ 2003 13:03
Τοποθεσία: Womans' Brain
Επικοινωνία:

Delete Duplicate content from mySQL

Δημοσίευση από Basilakis » 23 Μάιος 2008 20:49

Χρειάζομαι είτε ένα php script είτε μία mySQL command που μπορεί να διαγράφει διπλοεγραφές τις MYSQL σε ένα table (σε 2 μαζί, αλλα αυτό το κάνουμε και ξεχωριστά)

Μήπως γνωρίζει κανένας πως μπορεί να γίνει ή εάν γίνεται γενικά;

alexsoft

Delete Duplicate content from mySQL

Δημοσίευση από alexsoft » 23 Μάιος 2008 21:25

Στο παρακάτω παράδειγμα διαγράφουμε μία εγγραφή εφόσον υπάρχει πάνω από ένα ίδιο email

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

DELETE FROM table WHERE COUNT(e-mail) > 1 GROUP BY email LIMIT 1

Άβαταρ μέλους
MaZz
Script Master
Δημοσιεύσεις: 345
Εγγραφή: 20 Ιούλ 2005 19:41
Τοποθεσία: Beyond the dark sun
Επικοινωνία:

Delete Duplicate content from mySQL

Δημοσίευση από MaZz » 24 Μάιος 2008 01:24

@alexsoft
Η DELETE δεν παίρνει GROUP BY

intelcore2
Δημοσιεύσεις: 677
Εγγραφή: 27 Ιούλ 2007 19:46
Τοποθεσία: Pagrati
Επικοινωνία:

Delete Duplicate content from mySQL

Δημοσίευση από intelcore2 » 24 Μάιος 2008 02:16

Basilakis έχω φτιάξει ένα scriptaki σε coldfusion (ρίξτου μια ματιά το syntax είναι πολύ απλό θα πιάσεις αμέσως την λογική του)

Το όλο σκεπτικό είναι το εξής
1)Εκτελούμε το query μας, και ταξινομούμε τα αποτελέσματα βάση του πεδίου που θέλουμε να καθαρίσουμε για διπλοεγγραφές.
2)Τα αποτελέσματα τα περνάμε σε ένα array.
3)looparoume μέσα στο array και συγκρίνουμε την θέση χ με την θέση χ+1.Εάν περιέχουν ίδια αποτελέσματα πετύχαμε διπλοεγγραφή οπότε κάνουμε delete την μία εκ των δύο.
Σε περίπτωση 3 πλών τετραπλών εγγραφών απλά θα χρειαστεί να τρέξεις το scipt ακόμα μία δύο φορές μέχρι να καθαρίσει τελείως.

Το scriptaki
<cfset pointerdown="2">
<cfset doub="0">
<cfset faq = ArrayNew(1)>

<cfquery name="Recordset2" datasource="islands">
SELECT *
FROM links order by linkdescr
</cfquery>

<cfoutput query="Recordset2">
<cfset ArrayAppend(faq, #Recordset2.id#)>
<cfset ArrayAppend(faq,#Recordset2.islandcode#)>
<cfset ArrayAppend(faq,#Recordset2.linkdescr#)>
</cfoutput>


<cfloop index = "LoopCount" from = "3" to = "#Recordset2.RecordCount#" step="3" >


<cfif #faq[LoopCount]# is #faq[LoopCount+3]#>

<cfquery name="Deletedouble"
datasource="islands">
DELETE FROM links
WHERE id= = #faq[Loopcount-2]#
</cfquery>

<cfset #doub#=#doub#+1>
<table width="820" border="0">
<tr>
<td width="400"><cfoutput><span class="style1">#faq[LoopCount]#</span></cfoutput></td>
<td width="400"><cfoutput><span class="style1">#faq[LoopCount+3]# .....Code #faq[Loopcount-2]#</span></cfoutput></td></tr></cfif>

</cfloop>

alexsoft

Delete Duplicate content from mySQL

Δημοσίευση από alexsoft » 24 Μάιος 2008 02:47

MaZz έγραψε:@alexsoft
Η DELETE δεν παίρνει GROUP BY
Oh!!!!!! Sorry (πρωί - μεσημέρι - βράδυ ένα μυαλό τι να σου κάνει και αυτό με 2-3 ώρες ξεκούραση :hammer: :hammer: )

ORDER BY ήθελα να γράψω

Το σωστό
-----------

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

DELETE FROM table WHERE COUNT&#40;e-mail&#41; > 1 ORDER BY email DESC LIMIT 1

Άβαταρ μέλους
MaZz
Script Master
Δημοσιεύσεις: 345
Εγγραφή: 20 Ιούλ 2005 19:41
Τοποθεσία: Beyond the dark sun
Επικοινωνία:

Delete Duplicate content from mySQL

Δημοσίευση από MaZz » 24 Μάιος 2008 14:41

@alexsoft
Νομίζω ότι δε δουλεύει αυτό γιατί η COUNT είναι GROUP function.

@Basilakisweb
Να ένας τρόπος για να το κάνεις αυτό:

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

ALTER IGNORE TABLE `table_name` ADD UNIQUE KEY key_name &#40;column_name&#41;;
Όπου table_name το όνομα του πίνακα, key_name το όνομα του δείκτη (ένα όνομα όποιο θες εσύ. Είναι προαιρετικό και αν παραληφθεί η mysql ονομάζει το key με το όνομα του column) και column_name το όνομα του column που θες να αφαιρέσεις τις διπλές εγγραφές.

Σημείωση: με αυτόν τον τρόπο διαγράφονται όλες οι εγγραφές που έχουν πάνω από μία ίδιες τιμές τιμές (π.χ. μπορεί να έχεις 5 εγγραφές με την ίδια τιμή στο ίδιο πεδίο). Επίσης από τη στιγμή που προστέθηκε UNIQUE KEY δεν επιτρέπεται να εισαχθούν άλλες διπλές τιμές για το συγκεκριμένο πεδίο με την INSERT. Αν θες να επιτρέψεις και πάλι τις διπλές τιμές διέγραψε απλά το KEY:

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

ALTER TABLE `table_name` DROP KEY key_name;

Άβαταρ μέλους
Basilakis
PHP Moderator
Δημοσιεύσεις: 8574
Εγγραφή: 17 Νοέμ 2003 13:03
Τοποθεσία: Womans' Brain
Επικοινωνία:

Delete Duplicate content from mySQL

Δημοσίευση από Basilakis » 24 Μάιος 2008 14:47

Ορε παιδιά σας ευχαιστώ πολύ.

Hmm... δηαλδή εάν το κάνω και σαν Query το Alter Table μέσα σε php script θα κάνει την δουλεία μου για διπλοεγραφές... ΟΚ thx a lot :D

Άβαταρ μέλους
MaZz
Script Master
Δημοσιεύσεις: 345
Εγγραφή: 20 Ιούλ 2005 19:41
Τοποθεσία: Beyond the dark sun
Επικοινωνία:

Delete Duplicate content from mySQL

Δημοσίευση από MaZz » 24 Μάιος 2008 14:53

Basilakisweb έγραψε:Hmm... δηαλδή εάν το κάνω και σαν Query το Alter Table μέσα σε php script θα κάνει την δουλεία μου για διπλοεγραφές...
Εννοείται αυτό :victory:

alexsoft

Delete Duplicate content from mySQL

Δημοσίευση από alexsoft » 24 Μάιος 2008 15:38

MaZz έγραψε:@alexsoft
Νομίζω ότι δε δουλεύει αυτό γιατί η COUNT είναι GROUP function.
Σωστά

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


$link = mysql_connect&#40;"localhost", "mysql_user", "mysql_password"&#41;;
mysql_select_db&#40;"database", $link&#41;;

// Παίρνουμε τον αριθμό των εγγραφών που υπακούουν στην συνθήκη
$result = mysql_query&#40;"SELECT * FROM table WHERE email='".$usermail."'", $link&#41;;
$num_rows = mysql_num_rows&#40;$result&#41;;

// Εάν υπάρχει πάνω από 1 εγγραφή
if &#40;$num_rows > 1&#41; &#123;
  //Για κάθε μία εγγραφή πλην της τελευταίας κάνε διαγραφή.
  for &#40;$i=1; $i < $num_rows; $i++&#41; &#123;
     // Διαγράφουμε κατά σειρά από τις νεότερες εγγραφές προς την παλαιότερη.
     mysql_query&#40;"DELETE FROM table WHERE e-mail='".$useremail."' ORDER BY id DESC LIMIT 1", $link&#41;;
  &#125;
&#125;
ή μπορεί και το

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

// Εάν υπάρχει πάνω από 1 εγγραφή
if &#40;$num_rows > 1&#41; &#123;
   $deletion_rows = $num_rows -1;
  // Διαγράφουμε κατά σειρά από τις νεότερες εγγραφές προς την παλαιότερη.
  mysql_query&#40;"DELETE FROM table WHERE e-mail='".$useremail."' ORDER BY id DESC LIMIT ".$deletion_rows, $link&#41;;

&#125;
Νομίζω ότι αυτό θα δουλέψει αν και δεν το δοκίμασα.

Απάντηση

Επιστροφή στο “PHP Προγραμματισμός”

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

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