URL: https://www.overclockers.at/coding-stuff/hilfe_bei_sql-statement_neu_96526/page_1 - zur Vollversion wechseln!
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
between nimmt er auch nicht?
also if ... between 3 and 5 ...
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?
Zitatselect 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
nein, ich will die anzahl der benutzer, wie zwischen 3 und 5 objekte haben
also nur die anzahl der benutzer
1 ergebniszeile
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
naja, anzahl der benutzer... rettich variante + "count(benutzer.bid)"?
Zitat von DKCHnaja, anzahl der benutzer... rettich variante + "count(benutzer.bid)"?
so gehts:
Zitatselect 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
)
Zitat von rettichso gehts:
sauber ist das nicht, aber es funkt
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
blah, ein bissi was könnts selber auch machen - das select distinct erfordert einen parameter. steht auch in den sql syntax manuals
->
Zitatselect 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
)
k, sorry
i bin net so da sql-chef
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?
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
liefert mir ja nur max anzahl an usern / tag, aber net gleichzeitig. ausserdem würds damit probleme beim jahreswechsel gebenCode:select count(1) from tabelle group by datepart(dy,sessionstart)
overclockers.at v4.thecommunity
© all rights reserved by overclockers.at 2000-2025