webForumDet fria alternativet

spara odefinierat antal värden i en loop

ASP

4 svar · 597 visningar · startad av eriks

Medlem sedan apr. 20011 418 inlägg
Frågan#1

Jag har en databas där jag jämför data från några olika användare. Databasen har tre fält, "användarnummer", "data1" och "data2". Jag har tagit ut två olika recordset med värden och nu jämför jag dessa. Om de två data-fälten matchar vill jag spara undan användarnumret. (Spontant så vill jag spara undan användarnumret i en variabel, men det kanske finns bättre sätt? Jag vill iaf inte skriva in det i databasen för jag ska göra beräkningar med det, och sedan fortgå.)

Mitt problem är att jag inte vet hur många matchningar jag kommer få på förhand (då hade jag ju kunnat skapa det antalet variabler). Så jag vill skapa variabler allt medan jämförelsen pågår (om det inte finns något bättre sätt). Se koden nedan där de två recordseten jämförs, vad ska stå i noteraMatchning(användare) fältet? Jag vet ju dessutom inte hur många matchingar varje användare kommer att få, så det räcker inte att ha en lista "dessa har matchats", utan jag måste ha ett svar så som "användare 5 har matchats 5 gånger.

SQL = "Select * From Users WHERE .... referensgrupp"
Set RS = Connection.Execute(SQL)

SQL2 = "Select * From Users WHERE .... målgrupp"
Set RS2 = Connection.Execute(SQL2)

Do Until RS.EOF

Do Until RS2.EOF
if RS("Data1")  = RS2("Data1") then
if RS("Data2") = RS2("Data2") then
'NoteraMatching(användare)
end if
end if
RS2.MoveNext
Loop

RS.MoveNext
Loop

För att förtydliga ännu mer: Hade jag på förhand vetat att jag skulle få 3 användare som någon gång matchade, hade jag skapat variablerna a, b och c, och sedan skrivit c = c +1 varje gång den matchade... Men att på förhand skapa en variabel för varje användare känns onödigt, eftersom de flesta inte kommer matcha.

Medlem sedan apr. 20011 418 inlägg
#2

Svaret verkar heta array... Läser läser läser

Medlem sedan juni 2002256 inlägg
#3

Känns som man borde kunna lösa den uträkningen i en och samma SQL-sats istället för att hårdkoda fram det.

Vill du visa hur dina sql-satser ser ut, mer exakt, så kan jag kanske posta ett alternativ.

Medlem sedan apr. 20011 418 inlägg
#4
SQL = "Select användarnummer, data1, data2 From Users WHERE användarnummer = 1"
Set RS = Connection.Execute(SQL)

SQL2 = "Select användarnummer, data1, data2 From Users WHERE användarnummer = 2,3,7,9,12"
Set RS2 = Connection.Execute(SQL2)

Så i det första recordsetet kommer ju alltid första siffran vara 1. (Posterna kanske är 1,1,6 1,3,3 1,6,8). Medan i det andra kommer första siffran vara 2,3,7,9 eller 12 (t.ex. 2,5,5 3,3,3 3,1,6)

Med ovanstående exempel skulle alltså svaret vara att 3 matchar 2 gånger, de andra matchar ingen gång.

Observera att där mycket väl kan vara andra som matchar (t.ex. användare nummer 13), men det är jag inte intresserad av...

Medlem sedan juni 2002256 inlägg
#5

Hmm... vet inte om jag förstår dig 100% rätt.
Vill du se hur många ggr samma data1 och data2 det finns i tabellen kan du skriva sql-satsen i stil med:

SELECT 
     u1.*,
     (SELECT COUNT(*) FROM Users WHERE data1=u1.data1 AND data2=u1.data2 AND ID<>u1.ID) as AntalMatchar
FROM Users u1
LEFT JOIN Users u2 ON u2.data1=u1.data1 AND u2.data2=u1.data2 AND u2.ID<>u1.ID

Vill du endast ha de som matchar kan du ändra LEFT JOIN till INNER JOIN.

Men jag är fortfarande inte säker på hur dina sql-satser ser ut, mer exakt.
Prova skriv ut satserna och sen klistra in här.

SQL = "Select * From Users WHERE ... referensgrupp" 
Response.Write("<p>SQL 1<br />" & SQL & "</p>")
Set RS = Connection.Execute(SQL) 

SQL2 = "Select * From Users WHERE ... målgrupp" 
Response.Write("<p>SQL 2<br />" & SQL & "</p>")
Set RS2 = Connection.Execute(SQL2)
260 ms totalt · 4 externa anrop · v20260731065814-full.86ec41c2
120 ms — deklarationer (db)
0 ms — hämta statistik (cache)
134 ms — hämta tråd, inlägg och bilagor (db)
122 ms — ändringar (db)