webForumDet fria alternativet

Plocka ut värden i en tabell

ASP

7 svar · 414 visningar · startad av henkepenka

Medlem sedan sep. 2002125 inlägg
Frågan#1

Hej!

jag har en tabell i min databas som ser ut såhär:

Id | infoId | userId

1 1 1 <---
2 1 2 <---
3 3 1 <---
4 45 1
5 9 2
6 3 2 <---

Jag vill plocka ut de användarna (userId) som har infoId 1 och infoId 3. För att användarna 1 och 2 ska plockas ut måste både infoId 1 och 3 finnas.

Hur ska min SQL-sats skrivas? Jag får alla infoId´n i en array som jag splittar upp med följande kod:

arrSokProdukt = Split(txtId, ",")
For i = 0 To ubound(arrSokProdukt)    

<---SQL-SATSEN--->

Next

Vore toppen om någon kunde hjälpa mig med sql-satsen som ska vara i array-loopen...

Medlem sedan dec. 20025 483 inlägg
#2

/red

Medlem sedan dec. 200012 464 inlägg
#3

Vilken loop?

q = "select userid from t where infoid in (" & txtId & ")" & _
" group by userid having count(*) = " & cstr(len(txtId)-len(replace(txtId,",",""))+1)
Medlem sedan sep. 2002125 inlägg
#4

Såhär ser min SQL-sats ut om jag använder din kod:

select distinct t.userid from tabell t where t.infoid in (,1,7) Order By userId

Medlem sedan sep. 2002125 inlägg
#5

Med LarsG´s kod ser min SQL-sats ut såhär:

select userid from t where infoid in (,1,7) group by userid having count(*) = 3 Order By userId

Medlem sedan dec. 19996 721 inlägg
#6

Enda problemet är att txtId börjar med ett kommatecken. Se till att få bort det så kommer det att gå fint.

Medlem sedan sep. 2002125 inlägg
#7

Vad är fel med denna sql-sats?

searchStr = "select user.userId, user.userLogin, user.userPostort, user.userCountry, user.userOnline, user.userLatestlogin, user.userCountLogin, user_info.userId user_info.infoId from user_info INNER JOIN user ON user_info.userId = user.userId where user_all.infoId in (" & txtId & ")" & _
" group by user_info.userId having count(*) = " & cstr(len(txtId)-len(replace(txtId,",",""))+1)
Medlem sedan dec. 19996 721 inlägg
#8

Eftersom du tar med fler kolumner än den du grupperar på (userId) så måste aggregat-funktioner appliceras på dessa. Aggregat-funktioner är t.ex COUNT, MAX, MIN, AVG etc. Dessutom refererar du till tabellen user_all som inte finns definierad via join eller tabell-listan.

Det finns många sätt att lösa detta på. Ett par exempel:

1. Kör MAX eller MIN på alla kolumner utom userID

select user.userID, MAX(user.userLogin) .......

Inte helt snyggt, men klart funktionellt

2. Nästlad SELECT

searchStr = "select user.userId, user.userLogin, user.userPostort, user.userCountry, user.userOnline, user.userLatestlogin, user.userCountLogin, user_info.userId user_info.infoId from user_info INNER JOIN user ON user_info.userId = user.userId where usel.userId in (select userid from user_all where infoid in (" & txtId & ")" & _
" group by userid having count(*) = " & cstr(len(txtId)-len(replace(txtId,",",""))+1))"
266 ms totalt · 4 externa anrop · v20260731065814-full.6fe65c25
121 ms — deklarationer (db)
0 ms — hämta statistik (cache)
133 ms — hämta tråd, inlägg och bilagor (db)
129 ms — ändringar (db)