webForumDet fria alternativet
Logga in / Bli medlem

Subdate?

Databaser & SQL

19 svar · 857 visningar · startad av Inferis

Medlem sedan sep. 2000667 inlägg
Frågan#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
Medlem 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)
Medlem sedan sep. 2000667 inlägg
#3

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

Tack förresten!

Medlem 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
Medlem sedan sep. 2000667 inlägg
#5

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

Medlem sedan dec. 20025 483 inlägg
#6

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

Medlem sedan sep. 2000667 inlägg
#7

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

Medlem 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
Medlem 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

Medlem sedan sep. 2000667 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
Medlem sedan sep. 2000667 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.

Medlem sedan sep. 2000667 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?

Medlem 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.

Medlem sedan sep. 2000667 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)")
Medlem 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.

Medlem sedan sep. 2000667 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?

Medlem sedan juni 20014 421 inlägg
#17

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

Medlem sedan sep. 2000667 inlägg
#18

colione skrev:

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

Vilka av frågorna?

Medlem 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?

Medlem sedan sep. 2000667 inlägg
#20

Ok. Tack!

266 ms totalt · 4 externa anrop · v20260731065814-full.1b2494f0
124 ms — deklarationer (db)
0 ms — hämta statistik (cache)
134 ms — hämta tråd, inlägg och bilagor (db)
129 ms — ändringar (db)