webForumDet fria alternativet

Varför "Finns" hela tiden..?

ASP

15 svar · 252 visningar · startad av Mz

Medlem sedan aug. 2001139 inlägg
Frågan#1

Hej!

Kan man använda SELECT TOP 10 * osv. på detta sätt?

<%
'Connecta...
SQL = "SELECT TOP 10 * FROM tabell WHERE kol = "& Value &" ORDER BY ID DESC"
Set RecSet = Connect.Execute(SQL)

If RecSet.EOF Then
'##-- Tomt

Else
'##-- Finns

End If

'Stäng...
%>

Jag får bara "Finns" hur jag än gör, någon som vet varför?

------------------
~ Mz ~

Medlem sedan dec. 200012 464 inlägg
#2

Det kommer att bli finns om det finns minst en rad som uppfyller villkoret.

Vad vill du kolla? Om det finns minst 10 poster som uppfyller villkoret?

------------------
essentitia preter non sans multiplicandum

Medlem sedan aug. 2001139 inlägg
#3

Hej LarsG.

Jag vill kolla om de 10 senast sparade posterna innehåller värdet i Value, men det vill inte funka. ;)

Harru några tips?

------------------
~ Mz ~

Medlem sedan dec. 200012 464 inlägg
#4

Det är något helt annat, så frågan blir lite knepigare

sql = " select count(*) from tabell
  where id in (select top 10 id
   from tabell order by id desc)
  and kol = " & value & " having count(*) = 10 "

------------------
essentitia preter non sans multiplicandum

[Redigerat av LarsG den 20 nov 2001]

Medlem sedan aug. 2001139 inlägg
#5

Ok! :)
Ska genast testa.

*Tillbaka till ritbordet...*

Tack!

------------------
~ Mz ~

Medlem sedan dec. 200012 464 inlägg
#6

Råkade skriva fel, ser jag

sql = " select count(*) from tabell
where id in (select top 10 id
from tabell order by id desc)
and kol = " & value & " having count(*) = 10 "

------------------
essentitia preter non sans multiplicandum

Medlem sedan aug. 2001139 inlägg
#7

...därför jag inte fick det att fungera.. ;)

Ok, försöker igen. :)

------------------
~ Mz ~

Medlem sedan aug. 2001139 inlägg
#8

Nja, det fungerar inte redigt som jag tänkt mig..
Så här ser den rediga koden ut:

<%
strIP = Request.ServerVariables("REMOTE_ADDR")
strNamn = Request.Form("namn")

Set Connect = Server.CreateObject("ADODB.Connection")
Connect.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source ="& Server.MapPath("..\db\besokare.mdb")
SQL = "SELECT COUNT(*) FROM mimLinks WHERE ID IN (SELECT TOP 10 ID FROM mimLinks ORDER BY ID DESC) AND IP = '"& strIP &"' HAVING COUNT(*) = 10 "
Set RecSet = Connect.Execute(SQL)

'##------------------------------------------------------------------------------------------------------------------------------------------------------

	If RecSet.EOF Then
		
		'##-- IPnummret finns inte, så spara --##
		SQL = "INSERT INTO mimLinks (vaNamn, IP) VALUES('"& strNamn &"', '"& strIP &"')"
		Connect.Execute(SQL)
		Response.Redirect("basic.asp")
				
	Else

		'##-- IPnummer finns, skicka vidare --##
		Response.Redirect("basic.asp?action=reason")

	End If
				
'##------------------------------------------------------------------------------------------------------------------------------------------------------

RecSet.Close
Connect.Close

Set RecSet = Nothing
Set Connect = Nothing
%>

Nu sparar den mitt inlägg även om mitt IP-nummer ligger bland de 10 första posterna.. :(
Hilfe!

------------------
~ Mz ~

Medlem sedan dec. 200012 464 inlägg
#9

Då missförstod jag dig, jag tolkade det som om alla de 10 senaste måste innehålla värdet.
Förstår jag dig rätt om det räcker att en post bland de 10 sista innehåller värdet?

sql = " select count(*) from tabell
where id in (select top 10 id
from tabell order by id desc)
and kol = " & value & " having count(*) > 0 "

------------------
essentitia preter non sans multiplicandum

Medlem sedan aug. 2001139 inlägg
#10

Korrekt, det räcker med att en av posterna innehåller värdet för att inlägget inte skall sparas. :)

Sedan en liten fråga till: ;)
Varför tar det ca 1 min att utföra åtgärden med din SQL-sats? :(

(Win2000Pro, IIS5.0, 384 Mb RAM, Access2000)

------------------
~ Mz ~

[Redigerat av Mz den 20 nov 2001]

Medlem sedan aug. 2001139 inlägg
#11

Nu fungerar det i alla fall som jag tänkt, fick vända på kriterierna i IFsatsen. :)

Men det tar lååååååång tid att köra snutten. :(
Har du någon aning varför?

------------------
~ Mz ~

Medlem sedan dec. 200012 464 inlägg
#12

Hur mycket data har du i tabellen? Har du något index på kolumnen kol?

Är den här snabbare?

select distinct 1 from xxx
 where exists (select 1 from tabellen where id in (select top 10 id from tabellen order by id desc ) and kol = 'VALUE')

där xxx kan vara vilken tabell som helst, speciellt någon som innehåller lite data (minst en rad dock).

------------------
essentitia preter non sans multiplicandum

Medlem sedan aug. 2001139 inlägg
#13

Just nu - ca 4000 poster på 5 kolumner, inte mycket text i kolumnerna dock.
Inga fler tabeller i databasen...

------------------
~ Mz ~

Medlem sedan mars 20002 836 inlägg
#14

Access och subqueries är ingen höjdar kombination, segare än heinz ketchup :e

cya,
PatrikB

------------------
'## -- second place is the first looser -- ##'

Medlem sedan dec. 200012 464 inlägg
#15

Du kan ju ta bort having count(*) > 0 ser jag. Det räcker ju att kolla om recordsetet blir tomt eller inte.

Nu vet jag inget om hur Access optimerar frågor men att läsa igenom en tabell med 4000 rader skall inte ta en minut.

------------------
essentitia preter non sans multiplicandum

Medlem sedan dec. 200012 464 inlägg
#16

Utan subselect

select 1 from tabellen t1 inner join
(select top 10 id from tabellen
  order by id desc) as t2 on t1.id = t2.id 
where t1.kol = 'Value'

Nu vet jag inte om Access klarar av en sådan fråga.

------------------
essentitia preter non sans multiplicandum

254 ms totalt · 4 externa anrop · v20260731065814-full.86ec41c2
120 ms — deklarationer (db)
0 ms — hämta statistik (cache)
125 ms — hämta tråd, inlägg och bilagor (db)
126 ms — ändringar (db)