webForumDet fria alternativet

Subdate?

19 svar · 857 visningar · startad av Inferis

InferisMedlem sedan sep. 2000670 inlägg
#1

Varför raderas allt även om tidsintervallen ligger under 120 minuter?

DELETE FROM mess WHERE Last < SUBDATE(NOW(),INTERVAL 120 minute) AND svar = 2 OR svar = 3
Peter SMedlem sedan dec. 20025 483 inlägg
#2

Du saknar parenteser kring det första 'svar' och '3', alternativt

DELETE FROM mess WHERE Last < SUBDATE(NOW(),INTERVAL 120 minute) AND svar IN (2,3)
InferisMedlem sedan sep. 2000670 inlägg
#3

Hmm.
Varför kunde man inte göra på mitt sätt?

Tack förresten!

Peter SMedlem sedan dec. 20025 483 inlägg
#4

Det har att göra med hur det logiska uttrycket evalueras. I det här fallet sitter det implicita parenteser kring (Last < ... and svar = 2), så en rad i 'mess' raderas om

  1. Last < SUBDATE(NOW(),INTERVAL 120 minute) AND svar = 2, eller
  2. svar = 3
InferisMedlem sedan sep. 2000670 inlägg
#5

Vad gjorde min kod då? Det var så jag trodde att jag gjorde.

Peter SMedlem sedan dec. 20025 483 inlägg
#6

Nu börjar vi om ;) En rad i 'mess' skall raderas om...?

InferisMedlem sedan sep. 2000670 inlägg
#7

Den är äldre än 120 minuter och fältet svar är antingen 2 eller 3..

Peter SMedlem sedan dec. 20025 483 inlägg
#8

Då är ditt första försök felaktigt p.g.a. vad som står i inlägg #4. Vi kan vända på det: en rad i 'mess' raderas om:

  1. svar = 3 (oavsett om Last < subdate(...)), eller
  2. Last < SUBDATE(NOW(),INTERVAL 120 minute) och svar = 2
colioneMedlem sedan juni 20014 421 inlägg
#9

Och vad som händer är att den tar bort alla poster som är äldre än 120 minuter och har svar = 2 ELLER alla poster vars svar är lika med tre (utan andra vilkor) detta för att eller väger tyngre än och. om man ska lösa det på ditt sätt blir det:

DELETE FROM mess WHERE Last < SUBDATE(NOW(),INTERVAL 120 minute) AND (svar = 2 OR svar = 3)

Fast Peter S lösning är snyggare.

DELETE FROM mess WHERE Last < SUBDATE(NOW(),INTERVAL 120 minute) AND svar = 2 OR svar = 3

är egentligen lika med:

DELETE FROM mess WHERE (Last < SUBDATE(NOW(),INTERVAL 120 minute) AND svar = 2) OR svar = 3

InferisMedlem sedan sep. 2000670 inlägg
#10

Skulle detta funka? Bara undrar.

DELETE FROM mess WHERE Last < SUBDATE(NOW(),INTERVAL 120 minute) AND svar = 2 OR  Last < SUBDATE(NOW(),INTERVAL 120 minute) AND svar =  3
InferisMedlem sedan sep. 2000670 inlägg
#11

colione skrev:

Och vad som händer är att den tar bort alla poster som är äldre än 120 minuter och har svar = 2 ELLER alla poster vars svar är lika med tre (utan andra vilkor) detta för att eller väger tyngre än och.

Det stämmer inte. Den tog bort poster som hade svar = 2 och var en minut gamla.

InferisMedlem sedan sep. 2000670 inlägg
#12

Följdfråga. Hur lägger man in tex att för varje mess som raderas så ska det kollas ifall fältet Img innehåller data. Om så är fallet, radera bilden med det namnet?

Peter SMedlem sedan dec. 20025 483 inlägg
#13

Inferis skrev:

Skulle detta funka? Bara undrar.

DELETE FROM mess WHERE Last < SUBDATE(NOW(),INTERVAL 120 minute) AND svar = 2 OR  Last < SUBDATE(NOW(),INTERVAL 120 minute) AND svar =  3

Ja, det fungerar, eftersom AND binder starkare än OR.

Inferis skrev:

Följdfråga. Hur lägger man in tex att för varje mess som raderas så ska det kollas ifall fältet Img innehåller data. Om så är fallet, radera bilden med det namnet?

Om bilden ligger i en annan tabell bör du ha satt upp något slags referensvillkor som säger "om raden x i 'mess' raderas, så skall raden y i bildtabellen raderas". Gör en sökning på exempelvis ON DELETE CASCADE och REFERENCES.

InferisMedlem sedan sep. 2000670 inlägg
#14

Bildens namn finns bara i den tabellen.
Hur är en optimal lösning på denna koden?

'Kolla om ett meddelande har bild med sig 
SQL = "SELECT mess,img,Last,svar FROM mess where Last < SUBDATE(NOW(),INTERVAL 120 minute) AND svar IN (2,3)"
Set RS = Connection.Execute(SQL)
Do While NOT RS.EOF
	If RS("img") <> "" Then 'Det finns en bild! Radera den
		Set fso = Server.CreateObject("Scripting.FileSystemObject")
		fso.DeleteFile(Server.MapPath("..\..\messbilder\public_html\meddelanden") & "\" & RS("img"))
		Set Fso = nothing
	else 'Finns ingen bild
	End if
RS.MoveNext
Loop
RS.Close : Set RS = Nothing

'Radera meddelanden
connection.execute("DELETE FROM mess WHERE Last < SUBDATE(NOW(),INTERVAL 120 minute) AND svar IN (2,3)")
Peter SMedlem sedan dec. 20025 483 inlägg
#15

Jag kan tänka mig följande:

'Kolla om ett meddelande har bild med sig 
SQL = "SELECT img FROM mess where Last < SUBDATE(NOW(),INTERVAL 120 minute) AND svar IN (2,3) AND img is not null"
Set RS = Connection.Execute(SQL)
Set fso = Server.CreateObject("Scripting.FileSystemObject")
Do While NOT RS.EOF
	fso.DeleteFile(Server.MapPath("..\..\messbilder\public_html\meddelanden") & "\" & RS("img"))
	RS.MoveNext
Loop
Set Fso = nothing
RS.Close : Set RS = Nothing

'Radera meddelanden
connection.execute("DELETE FROM mess WHERE Last < SUBDATE(NOW(),INTERVAL 120 minute) AND svar IN (2,3)")

Detta förutsätter att om en bild inte existerar så sparas NULL i stället. Om inte NULL sparas utan en tom sträng, kan du ändra AND img is not null till AND img <> ''. Det förstnämnda förfarandet är att föredra.

InferisMedlem sedan sep. 2000670 inlägg
#16

Nu är det NULL som sparas. Men är din kod mycket mindre prestandakrävande? Verkar ju nästan som samma princip.

Detta är tänkt att köras som en .vbs med Schemaläggaren i Windows.
Ska man ta bort Server.CreateObject och byta mot bara CreateObject? Funkar fso i .vbs?

colioneMedlem sedan juni 20014 421 inlägg
#17

Ja och ja, på dina frågor. :)

InferisMedlem sedan sep. 2000670 inlägg
#18

colione skrev:

Ja och ja, på dina frågor. :)

Vilka av frågorna?

colioneMedlem sedan juni 20014 421 inlägg
#19

Förlåt. Denna

Ska man ta bort Server.CreateObject och byta mot bara CreateObject? Funkar fso i .vbs?

InferisMedlem sedan sep. 2000670 inlägg
#20

Ok. Tack!

125 ms totalt · 3 externa anrop · v20260731065814-full.0e50b1ef
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
123 ms — hämta tråd, inlägg och bilagor (db)