Avatar billede axkris Nybegynder
15. oktober 2004 - 16:25 Der er 7 kommentarer og
1 løsning

Sletter for meget

Hej alle

Jeg har dette script, som burde slette alle chattere, som står som offline:

strSQL = "DELETE FROM CHAT_ONLINE WHERE ID IN (SELECT ID FROM CHAT_MEMBERS WHERE ONLINE_NOW = 'false')"
dataConn.execute(strSQL)

Men den sletter også alle dem, som står som "online". Hvorfor?
Avatar billede arne_v Ekspert
15. oktober 2004 - 16:27 #1
Kan der være flere records i den tabel med samme id hvor mindst en opfylder
betingelsen.
Avatar billede axkris Nybegynder
15. oktober 2004 - 16:51 #2
Det burde der ikke være:

CREATE TABLE CHAT_ONLINE (
  ID int(11) NOT NULL auto_increment,
  ChannelID int(11) NOT NULL default '0',
  ChatMemberID int(11) NOT NULL default '0',
  UNIQUE KEY ID (ID)
) TYPE=MyISAM;


CREATE TABLE CHAT_MEMBERS (
  ChatMemberID int(11) NOT NULL auto_increment,
  MemberID int(11) NOT NULL default '0',
  ChannelID int(11) NOT NULL default '0',
  Mode int(11) NOT NULL default '0',
  Status int(11) NOT NULL default '0',
  Nick text NOT NULL,
  Name text NOT NULL,
  Age text NOT NULL,
  Sex text NOT NULL,
  IP text NOT NULL,
  Password text NOT NULL,
  Email text NOT NULL,
  Last_online datetime NOT NULL default '0000-00-00 00:00:00',
  Online_now text NOT NULL,
  PRIMARY KEY  (ChatMemberID),
  KEY ID (ChatMemberID)
) TYPE=MyISAM;
Avatar billede axkris Nybegynder
15. oktober 2004 - 16:56 #3
Hvis jeg f.eks. bygger koden på følgende måde, virker det fint:

strSQL = "SELECT ChatMemberID FROM CHAT_MEMBERS WHERE Online_now = 'false'"
set rs = dataConn.execute(strSQL)
   
while not (rs.eof or rs.bof)
  strSQL="DELETE FROM CHAT_ONLINE WHERE ChatMemberID = " & rs("ChatMemberID")
  dataConn.execute(strSQL)
  rs.movenext
wend

Men jeg vil jo hellere have den mere optimerede kode såsom ovenstående.
Avatar billede arne_v Ekspert
15. oktober 2004 - 20:51 #4
Spørgsmål: dine CREATE TABLE er til MySQL - du har postet spørgsmålet
i MS SQLServer kategorien - hvad er det ?
Avatar billede axkris Nybegynder
15. oktober 2004 - 21:29 #5
Jeg er ved at konvertere fra myssql til mssql. Kan du hjælpe?
Avatar billede arne_v Ekspert
15. oktober 2004 - 21:30 #6
Jeg tvivler.

Det eneste bud jeg har er jeg allerede kommet med.
19. oktober 2004 - 14:30 #7
For mig ser det ud som om du "joiner" på feltet ID, selvom du egentligt ønsker ChatMemberID:
DELETE FROM CHAT_ONLINE WHERE ChatMemberID  IN (SELECT ID FROM CHAT_MEMBERS WHERE ONLINE_NOW = 'false'
Avatar billede axkris Nybegynder
20. oktober 2004 - 12:20 #8
Så sletter den intet, men følgende ser ud til at gøre det korrekt.

DELETE FROM CHAT_ONLINE WHERE ChatMemberID IN (SELECT ChatMemberID FROM CHAT_MEMBERS WHERE ONLINE_NOW = 'false'
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