Avatar billede sjh Nybegynder
13. august 2006 - 07:40 Der er 16 kommentarer og
1 løsning

slet alt som ikke kommer med distinct

Jeg skal ha slettet alle dem som IKKE kommer frem når jeg bruger :
"SELECT DISTINCT email, remote FROM ehk_spam;"

Jeg har prøvet med :
"DELETE FROM ehk_spam WHERE email, remote NOT IN (SELECT DISTINCT email, remote FROM ehk_spam);"

men det virker ikke :(


CREATE TABLE `ehk_spam` (
  `id` int(11) unsigned NOT NULL auto_increment,
  `email` varchar(70) default NULL,
  `remote` varchar(100) default NULL,
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
Avatar billede arne_v Ekspert
13. august 2006 - 16:15 #1
SELECT DISTINCT returnerer alt bare uden duplikater

DELETE WHERE IN SELECT DISTINCT bør vel derfor slette alt

jeg gætter på at du vil af med duplikater - korrekt ?

og så er spørgsmålet - hvis 2 rækker er duplikater hvilken af dem skal så slettes ?
Avatar billede sjh Nybegynder
13. august 2006 - 16:41 #2
Slet duplikater JA.

Altså.. der kan godt være 100 ens "remote" hvis ikke "email" er den samme.. eller omvendt.. og den skal slette (id, email, remote)
Avatar billede sjh Nybegynder
13. august 2006 - 16:44 #3
hvis jeg bare fyre den af sådan : "SELECT DISTINCT email, remote FROM ehk_spam;" så er det hvad jeg skal bruge.. alt andet skal slettes..
Avatar billede arne_v Ekspert
13. august 2006 - 20:16 #4
ide:

DELETE FROM ehk_spam es1 WHERE es1.id <> (SELECT MAX(es2.id) FROM ehk_spam es2 WHERE es1.email = es2.email AND es1.remote = es2.remote)
Avatar billede arne_v Ekspert
13. august 2006 - 20:17 #5
anden ide:

INSERT INTO ny_ehk_spam SELECT MAX(id),email,remote FROM ehk_spam GROUP BY email,remote
Avatar billede sjh Nybegynder
13. august 2006 - 21:03 #6
Ja syntes ikke jeg kan få den til at virke.. og den med en ny table.. er ikke nogle god ide, for så skal jeg lave en ny table hver gang jeg poster..

men det kan måske laves lidt som :

SELECT MAX(id) AS nid FROM ehk_spam GROUP BY email, remote
DELETE FROM ehk_spam WHERE id NOT IN (nid,nid,nid,nid)

bare på en mere smart måde??
Avatar billede sjh Nybegynder
13. august 2006 - 21:22 #7
Måske kan det gøres bedre et helt andet sted..

Jeg har nogle checkbox som har de id som skal flyttes til en spam table.. og det gør jeg på den her måde:

$varID = "12,33,48,56"; // <- id fra checkbox

"INSERT INTO ehk_spam (email, remote) SELECT email, remote FROM ehk_email WHERE ehk_email.id IN (".$varID.");"
"DELETE FROM ehk_email WHERE id IN (".$varID.");"

Det er så her jeg vil ha slettet dem som duplikate..

CREATE TABLE `ehk_email` (
  `id` int(11) unsigned NOT NULL auto_increment,
  `date` int(11) default '0',
  `name` varchar(150) default NULL,
  `email` varchar(70) default NULL,
  `subject` varchar(150) default NULL,
  `message` text,
  `remote` varchar(100) character set latin1 collate latin1_bin NOT NULL default '',
  `visited` int(1) NOT NULL default '0',
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
Avatar billede arne_v Ekspert
13. august 2006 - 21:34 #8
hvad fejl får du på den DELETE WHERE id <> SELEXT MAX ?

og hvilken MySQL version kører du ?
Avatar billede sjh Nybegynder
13. august 2006 - 21:38 #9
1064
marker : WHERE es1.id <> (SELECT MAX(es2.id) FROM ehk_spam es2 WHERE es1.email = es2.email AND es1.remote = es2.remote)
Avatar billede sjh Nybegynder
13. august 2006 - 21:39 #10
mysql 4.1.7 php 4
Avatar billede arne_v Ekspert
13. august 2006 - 22:14 #11
hm - jeg kan heller ikke få den delere til at virke

men så

udfør

SELECT id FROM ehk_spam es1 WHERE es1.id <> (SELECT MAX(es2.id) FROM ehk_spam es2 WHERE es1.email = es2.email AND es1.remote = es2.remote)

gem resultat i en varabel x og udfør

DELETE FROM ehk_spam WHERE id IN (x)
Avatar billede sjh Nybegynder
13. august 2006 - 23:25 #12
øhh du mener vel :

SELECT MAX(id) AS nid FROM ehk_spam GROUP BY email, remote
DELETE FROM ehk_spam WHERE id IN (nid)

Den her kommer bare med id 1,2,3,4..
SELECT id FROM ehk_spam es1 WHERE es1.id <> (SELECT MAX(es2.id) FROM ehk_spam es2 WHERE es1.email = es2.email AND es1.remote = es2.remote)
Avatar billede sjh Nybegynder
13. august 2006 - 23:27 #13
selfølige.. NOT

DELETE FROM ehk_spam WHERE id NOT IN (nid)
Avatar billede sjh Nybegynder
13. august 2006 - 23:50 #14
hvad er hurtigst at bruge: mysql_fetch_array() eller mysql_fetch_assoc()

arne_v du må godt smaide et svar..
Avatar billede arne_v Ekspert
13. august 2006 - 23:56 #15
umiddelbart vil jeg tro at:

1. mysql_fetch_array med MYSQL_NUM
2. mysql_fetch_array med MYSQL_ASSOC og mysql_fetch_assoc
3. mysql_fetch_array med MYSQL_BOTH og mysql_fetch_array default

men jeg tror ikke at forskellen kan måles !
Avatar billede arne_v Ekspert
13. august 2006 - 23:57 #16
og et svar
Avatar billede sjh Nybegynder
14. august 2006 - 00:05 #17
Mange tak for hjælpen
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Computerworld tilbyder specialiserede kurser i database-management

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester