Avatar billede JJ77 Juniormester
11. februar 2006 - 16:46 Der er 7 kommentarer og
1 løsning

Slet fra to tabeller

Hvordan får jeg slettet en bruger som har data i to tabeller.
Tabellerne ser ud som følger:

CREATE TABLE `users` (
  `userId` int(11) NOT NULL auto_increment,
  `userStatus` tinyint(4) NOT NULL default '0',
  `userName` char(40) NOT NULL default '0',
  `userPassword` char(48) NOT NULL default '0',
  `sidsteBesoeg` datetime default '0000-00-00 00:00:00',
  PRIMARY KEY  (`userId`),
  UNIQUE KEY `userName` (`userName`)
) TYPE=MyISAM AUTO_INCREMENT=69 ;
   

CREATE TABLE `userProfile` (
  `userId` int(11) NOT NULL default '0',
  `userFirstName` varchar(64) NOT NULL default '',
  `userEmail` varchar(64) NOT NULL default '',
  `userLastName` varchar(64) NOT NULL default '',
  `userCompany` varchar(15) NOT NULL default '',
  `userAddr1` varchar(64) NOT NULL default '',
  `userAddr2` varchar(64) NOT NULL default '',
  `userCity` varchar(64) NOT NULL default '',
  `userState` varchar(64) NOT NULL default '',
  `userCountry` varchar(64) NOT NULL default '',
  `userTel` varchar(15) NOT NULL default '',
  `userMobiTel` varchar(15) NOT NULL default '',
  `userHomeTel` varchar(15) NOT NULL default '',
  `userFax` varchar(15) NOT NULL default '',
  `userZip` varchar(10) NOT NULL default '',
  `userWeb` varchar(128) NOT NULL default '',
  `userValidationKey` varchar(32) NOT NULL default '',
  `userIP` varchar(32) NOT NULL default '',
  `userSignUp` datetime NOT NULL default '0000-00-00 00:00:00',
  `userValidated` tinyint(1) NOT NULL default '0',
  `userNewsLetter` tinyint(1) NOT NULL default '0',
  PRIMARY KEY  (`userId`)
) TYPE=MyISAM;


Jeg har selv prøvet med følgende:
mysql_query("DELETE users, userProfile FROM users, userProfile WHERE (users.userId=userProfile.userId, users.userStatus='1') AND users.sidsteBesoeg < NOW()");

Det med "users.sidsteBesoeg < NOW() skal jeg på en eller anden måde have ændret så det kun er brugere som ikke har logget ind i 1 år som bliver slettet:)
Avatar billede Slettet bruger
11. februar 2006 - 17:36 #1
De skal slettes med to deletes

først en delete på tabellen users og så en på userprofiles.

Og det bør foretages som en transaction, hvis det ellers er understøttet af PHP og den version af mySQL du anvender.
Avatar billede horsmark Nybegynder
11. februar 2006 - 17:44 #2
Ville dette virke ?

DELETE FROM
  users, userProfile
WHERE
users.userId = userProfile.userId AND
users.userStatus='1' AND
users.sidsteBesoeg < ( NOW() - 31536000 )
Avatar billede JJ77 Juniormester
11. februar 2006 - 19:28 #3
Har en anden sql-sætning som virker. Denne sletter i 2 tabeller:

mysql_query("DELETE salgAfProdukt, billeder_salgAfProdukt FROM salgAfProdukt, billeder_salgAfProdukt WHERE billeder_salgAfProdukt.artikelid=salgAfProdukt.id AND salgAfProdukt.loebetidForAnnonce < NOW()");   


Så er næsten 100 sikker på at sætningen skal starte således her:

DELETE users, userProfile FROM users, userProfile WHERE
Avatar billede JJ77 Juniormester
11. februar 2006 - 19:54 #4
Fik det til at virke med følgende:

mysql_query("DELETE users, userProfile FROM users, userProfile WHERE users.userId = userProfile.userId AND users.userStatus='1' AND users.sidsteBesoeg < DATE_SUB(NOW(), INTERVAL 1 YEAR)");

Så "kryptos">> det kan altså godt klares med en sql-sætning..
Og Horsmark, smider du ikke lige et svar.. takker :)
Avatar billede horsmark Nybegynder
12. februar 2006 - 05:48 #5
allrighty toplækkert at du fik det til at spille :-)
Avatar billede horsmark Nybegynder
12. februar 2006 - 05:59 #6
læsestof:

For the first multiple-table syntax, only matching rows from the tables listed before the FROM clause are deleted. For the second multiple-table syntax, only matching rows from the tables listed in the FROM  clause (before the USING clause) are deleted. The effect is that you can delete rows from many tables at the same time and have additional tables that are used only for searching:

DELETE t1, t2 FROM t1, t2, t3 WHERE t1.id=t2.id AND t2.id=t3.id;

Or:

DELETE FROM t1, t2 USING t1, t2, t3 WHERE t1.id=t2.id AND t2.id=t3.id;

These statements use all three tables when searching for rows to delete, but delete matching rows only from tables t1 and t2.

http://dev.mysql.com/doc/refman/5.0/en/delete.html
Avatar billede JJ77 Juniormester
12. februar 2006 - 13:35 #7
Horsmark>> med hensyn til det læsestof du har skrevet, så ser sql-sætningen ok ud, ik?
Avatar billede horsmark Nybegynder
12. februar 2006 - 13:45 #8
yes som sagt er der 2 muligheder og din ser rigtig ud :-)
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