"Christmas - the time to fix the computers of your loved ones" « Lord Wyrm

hilfe bei sql-statement (neu)

Oculus 23.10.2003 - 14:08 523 12
Posts

Oculus

void
Avatar
Registered: Jun 2001
Location: schlafzimmer
Posts: 856
ich hab mich bei einem sql-statement festgefahren, das ich allein nicht lösen werd

zusammenhang:
ich habe die tabellen benutzer, objekt und mapping
jeder benutzer kann beliebig viele objekte gemappt haben, das steht in da mapping
es gibt aber noch andere sachen, die objekte gemappt haben können, deshalb gibts in da mapping-tabelle die spalte type, die angibt, für wen das mapping gilt
also wenn type=1 steht in mapid die id eines benutzers, wenn type=2 steht in mapid die id einer gruppe etc.

ich brauche jetzt eine abfrage, die mir die anzahl an benutzern liefert, die zwischen zb. 3 und 5 objekten gemappt haben.

habe folgende abfrage, die mir schonmal alle benutzer liefert, die etwas gemappt haben + die anzahl der gemappten objekte

Code:
select count(objekt.oid)
from
	benutzer,objekt,mapping
where
	mapping.oid=objekt.oid and mapping.mapid=benutzer.bid
	and benutzer.bid in (select mapping.mapid from mapping where mapping.type=1)
group by benutzer.bid

jetzt muss ich nur noch irgendwie ein count über das ergebnis machen, wobei nur zeilen mit anzahl zwischen zb 3 und 5 berücksichtigt werden

ich schaffs aber nicht. ein subquery kann ich nicht mit einer <,>,<= usw bedingung verwenden.
auch ein (...) in (3,4,5) geht nicht

bin für alle tips/verbesserungsvorschläge offen

db-design geht nicht auf mein konto, deshalb bitte keine posts wie "das design is a schas, machs anders"
ich wills auch nicht programmtechnisch lösen. es soll rein aufm db-server passieren, der übrigends ein 2000er mssql ist
Bearbeitet von Oculus am 03.11.2003, 16:19

hctuB

Bloody Newbie
Avatar
Registered: Feb 2002
Location: Pampa LL
Posts: 2402
between nimmt er auch nicht?

also if ... between 3 and 5 ...

Guest

Deleted User
Registered: n/a
Location:
Posts: n/a
ein between im subselect musst in dem fall mit "HAVING" einführen. ich weiß aber net genau, wie das da in deine query soll, damit das sinn macht?

Zitat
select benutzer.bid,count(objekt.oid) as anzahl_objekte
from
benutzer,objekt,mapping
where
mapping.oid=objekt.oid and mapping.mapid=benutzer.bid
and benutzer.bid in (select mapping.mapid from mapping where mapping.type=1)
group by benutzer.bid
having count(objekt.oid) between 3 and 5

würde dir alle benutzer und anzahl ihrer objekte bringen - aber eben nur die benutzer, die zwischen 3 und 5 objekten haben.

willst du das?

Oculus

void
Avatar
Registered: Jun 2001
Location: schlafzimmer
Posts: 856
nein, ich will die anzahl der benutzer, wie zwischen 3 und 5 objekte haben

also nur die anzahl der benutzer :)
1 ergebniszeile
Bearbeitet von Oculus am 23.10.2003, 15:00

Bodominjaervi

OC Addicted
Registered: Jul 2002
Location: AT
Posts: 7813
die lösung vom rettich is ja eh richtig! du kriegst die Anzahl aller Benutzer, die 3,4,5 Objekte haben.

damit du nur die benutzer hast, gib einfach das count(objekt.oid) weg

ASO!!! Habs schon verstanden! bin grad dabei ;)
Bearbeitet von Bodominjaervi am 23.10.2003, 15:06

DKCH

...
Registered: Aug 2002
Location: #
Posts: 3279
naja, anzahl der benutzer... rettich variante + "count(benutzer.bid)"?

Bodominjaervi

OC Addicted
Registered: Jul 2002
Location: AT
Posts: 7813
Zitat von DKCH
naja, anzahl der benutzer... rettich variante + "count(benutzer.bid)"?

bei count(benutzer.bid) liefert er die Anzahl der Objekte des Benutzers zurück und nicht die Anzahl der Benutzer

Guest

Deleted User
Registered: n/a
Location:
Posts: n/a
so gehts:

Zitat
select count (distinct) from benutzer where bid in
(
select benutzer.bid as anzahl_objekte
from
benutzer,objekt,mapping
where
mapping.oid=objekt.oid and mapping.mapid=benutzer.bid
and benutzer.bid in (select mapping.mapid from mapping where mapping.type=1)
group by benutzer.bid
having count(objekt.oid) between 3 and 5
)

sauber ist das nicht, aber es funkt :)

Bodominjaervi

OC Addicted
Registered: Jul 2002
Location: AT
Posts: 7813
Zitat von rettich
so gehts:

sauber ist das nicht, aber es funkt :)

ich krieg einen Syntax-Error :confused:

Oculus

void
Avatar
Registered: Jun 2001
Location: schlafzimmer
Posts: 856
schaut gut aus, wenn ich das sub-select 'select benutzer.bid as anzahl_objekte ...' allein ausführ
es kommt die richtige anzahl an zeilen zurück für diese anzahl an mappings

leider bekomm ich an syntaxfehler bei einer '(', wenn ich das ganze laufen lassen will

Guest

Deleted User
Registered: n/a
Location:
Posts: n/a
blah, ein bissi was könnts selber auch machen - das select distinct erfordert einen parameter. steht auch in den sql syntax manuals :rolleyes:

->

Zitat
select count (distinct bid) from benutzer where bid in
(
select benutzer.bid as anzahl_objekte
from
benutzer,objekt,mapping
where
mapping.oid=objekt.oid and mapping.mapid=benutzer.bid
and benutzer.bid in (select mapping.mapid from mapping where mapping.type=1)
group by benutzer.bid
having count(objekt.oid) between 3 and 5
)

bitte, danke.

Oculus

void
Avatar
Registered: Jun 2001
Location: schlafzimmer
Posts: 856
k, sorry
i bin net so da sql-chef :D

aber danke für die hilfe !
hast was gut, sofern ich das mal einlösen kann :)

ps: weilst meinst, das ist nicht sauber
was gäbs für alternative lösungsmöglichkeiten, ohne das db-schema umzudrehn?

Oculus

void
Avatar
Registered: Jun 2001
Location: schlafzimmer
Posts: 856
hab wieder neues problem
keine ahnung, ob das so gefinkelt ist, wie ich mir das vorstell

also:
table mit spalten userid, sessionstart, sessionend und duration
ich brauch den spitzenwert der gleichzeitig eingeloggten user / tag

ich muss mit 1 statement das ergebnis rausbekommen

Code:
select count(1) from tabelle group by datepart(dy,sessionstart)
liefert mir ja nur max anzahl an usern / tag, aber net gleichzeitig. ausserdem würds damit probleme beim jahreswechsel geben

falls es wieder wen gfreit, dass er mir hilft, würd mich das freuen :)
Kontakt | Unser Forum | Über overclockers.at | Impressum | Datenschutz