hilfe bei sql-statement (neu)

Seite 1 von 1 - Forum: Coding Stuff auf overclockers.at

URL: https://www.overclockers.at/coding-stuff/hilfe_bei_sql-statement_neu_96526/page_1 - zur Vollversion wechseln!


Oculus schrieb am 23.10.2003 um 14:08

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


hctuB schrieb am 23.10.2003 um 14:20

between nimmt er auch nicht?

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


schrieb am 23.10.2003 um 14:43

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 schrieb am 23.10.2003 um 14:48

nein, ich will die anzahl der benutzer, wie zwischen 3 und 5 objekte haben

also nur die anzahl der benutzer :)
1 ergebniszeile


Bodominjaervi schrieb am 23.10.2003 um 15:04

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 ;)


DKCH schrieb am 23.10.2003 um 15:13

naja, anzahl der benutzer... rettich variante + "count(benutzer.bid)"?


Bodominjaervi schrieb am 23.10.2003 um 15:14

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


schrieb am 23.10.2003 um 15:21

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 schrieb am 23.10.2003 um 15:34

Zitat von rettich
so gehts:

sauber ist das nicht, aber es funkt :)

ich krieg einen Syntax-Error :confused:


Oculus schrieb am 23.10.2003 um 15:36

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


schrieb am 23.10.2003 um 15:40

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 schrieb am 23.10.2003 um 15:44

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 schrieb am 03.11.2003 um 09:38

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 :)




overclockers.at v4.thecommunity
© all rights reserved by overclockers.at 2000-2025