Avatar billede axkris Nybegynder
07. juli 2004 - 14:42 Der er 14 kommentarer og
3 løsninger

Avanceret delete-sætning

Hej

Jeg vil slette alle de records i CHAT_ONLINE, hvor chatteren er blevet opdateret som værende offline i CHAT_MEMBERS. (CHAT_MEMBERS indeholder en masse statistisk, mens CHAT_ONLINE kun indeholder en tæller, ChannelID og Nick.)

________________________________________________

strSQL="UPDATE CHAT_MEMBERS set Online_now = 'false' where last_online < '" & alternativeDateTime2(DateAdd("n", -30, Now())) & "'"
dataConn.execute(strSQL)
   
strSQL="DELETE FROM CHAT_ONLINE WHERE CHAT_MEMBERS.Online_now = 'false'"
dataConn.execute(strSQL)

Update virker fint - det er delete-sætningen, som jeg skal have lidt hjælp til.
Avatar billede axkris Nybegynder
07. juli 2004 - 14:43 #1
Den siger ved delete-sætningen: [TCX][MyODBC]Unknown table 'CHAT_MEMBERS' in where clause
Avatar billede Slettet bruger
07. juli 2004 - 14:46 #2
Er det ikke fra tabellen CHAT_MEMBERS du vil slette?

Prøv:
strSQL="DELETE FROM CHAT_MEMBERS WHERE CHAT_MEMBERS.Online_now = 'false'"
dataConn.execute(strSQL)
Avatar billede proaccess Nybegynder
07. juli 2004 - 14:46 #3
Inden du forsøger rahp's forslag, så lav lige en backup af dine data!
Avatar billede axkris Nybegynder
07. juli 2004 - 14:48 #4
Det er faktisk i de records, som ligger i CHAT_ONLINE, som skal slettes.
Avatar billede axkris Nybegynder
07. juli 2004 - 14:49 #5
CHAT_MEMBERS er login-profilen (og en masse stat), mens CHAT_ONLINE er en tabel, som jeg kun bruger til at tælle, hvor mange der er online på de forskellige chat-kanaler.
Avatar billede axkris Nybegynder
07. juli 2004 - 14:50 #6
Det er faktisk i de records, som ligger i CHAT_ONLINE, som skal slettes
=
Det er faktisk de records, som ligger i CHAT_ONLINE, som skal slettes.
Avatar billede axkris Nybegynder
07. juli 2004 - 14:52 #7
#
# Struktur dump for tabellen `CHAT_MEMBERS`
#

CREATE TABLE CHAT_MEMBERS (
  ID int(11) NOT NULL auto_increment,
  Member_ID int(11) NOT NULL default '0',
  M_Name text NOT NULL,
  Member_IP text NOT NULL,
  last_online datetime NOT NULL default '0000-00-00 00:00:00',
  Online_now text NOT NULL,
  PRIMARY KEY  (ID),
  KEY ID (ID)
) TYPE=MyISAM;


#
# Struktur dump for tabellen `CHAT_ONLINE`
#

CREATE TABLE CHAT_ONLINE (
  ID int(11) NOT NULL auto_increment,
  ChannelID int(11) NOT NULL default '0',
  Nick text NOT NULL,
  UNIQUE KEY ID (ID)
) TYPE=MyISAM;
Avatar billede proaccess Nybegynder
07. juli 2004 - 14:52 #8
Hvis din version af MySQL (jeg ved ikke hvornår/om det begynder), så er det altså IGEN joins, du skal have fat i...

DELETE O.* FROM CHAT_ONLINE O INNER JOIN CHAT_MEMBERS M ON O.Member=M.Member WHERE M.Online_now = 'false'

O.Member=M.Member beskriver den sammenhæng der er mellem dine tabeller...
Avatar billede proaccess Nybegynder
07. juli 2004 - 14:54 #9
Er det M_Name som er lig med Nick eller hvilken sammenhæng har du?
Avatar billede axkris Nybegynder
07. juli 2004 - 14:59 #10
Ja, M_Name = Nick

Dog...:

strSQL="DELETE O.* FROM CHAT_ONLINE O INNER JOIN CHAT_MEMBERS M ON O.Nick=M.M_Name WHERE M.Online_now = 'false'"

[TCX][MyODBC]You have an error in your SQL syntax near 'O.* FROM CHAT_ONLINE O INNER JOIN CHAT_MEMBERS M ON O.Nick=M.M_Name WHERE M.Onli' at line 1
Avatar billede proaccess Nybegynder
07. juli 2004 - 15:05 #11
Langt op i rækken af versioner på MySQL har det IKKE været muligt at slette ud fra flere tabeller, det lader til også at være tilfældet i din version.

Jeg skynder mig at sige at jeg ikke ved i hvilken version løsningen kan laves (hvis MySQL overhovedet tilbyder muligheden)

Alternativt må du tilføje et tabel til CHAT_ONLINE, som du så kan opdatere ud fra CHAT_MEMBERS og derefter slette alene vedd brug af CHAT_ONLINE.
Avatar billede arne_v Ekspert
07. juli 2004 - 15:26 #12
Hvad version af MySQL bruger du ?
Avatar billede axkris Nybegynder
07. juli 2004 - 15:42 #13
MySQL 3.23.58
Avatar billede arne_v Ekspert
07. juli 2004 - 16:00 #14
Så kan det ikke gøres i en query.

Bedste råd er nok:

SELECT id FROM chat_members WHERE online_now = 'false'

og så kunstruere en dynamisk SQL streng ud fra dens resultat.

Hvis den returnerer:

4
5
8

så kalder du:

DELETE FROM chat_online WHERE id IN (4,5,8)
Avatar billede axkris Nybegynder
07. juli 2004 - 16:05 #15
Mange tak for rådgivningen - tryk også svar Arne.

Jeg har nu lavet det sådan:

    strSQL = "SELECT M_NAME 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 NICK = '" & RS("M_NAME") & "'"
        dataConn.execute(strSQL)
        rs.movenext
    wend

Ved godt at det ikke er køn kode, ej heller er den særlig effektiv, men det er lige meget, fordi jeg opgraderer senere den nyeste version af MSSQL. Har hørt at MSSQL har flere funktioner, kører lidt mere stabilt og at den så koster lidt flere penge, har ikke den store betydning.
Avatar billede arne_v Ekspert
07. juli 2004 - 16:07 #16
svar
Avatar billede arne_v Ekspert
07. juli 2004 - 16:08 #17
I MS SQL, MySQL 4.1.x og manga andre databaser kan du bare lave:

DELETE FROM chat_online WHERE id IN (SELECT id 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