Frage zu Sql-Abfrage

#1
So,

nachdem ich zu meiner letzten Frage mit Java und MySQL ja schnell gute Antworten hatte, probiere ich das gleich nochmal.

Eckdaten sind die gerade genannten: Java und MySQL

Die Tabellen halte ich jetzt mal etwas abstrakt und auf das für die Frage nötigste beschränkt.

Es geht hier um 3 Tabellen:
Code:
Tabelle Objekte
|------|-----------------|
|  oID  |    Objekt        |
--------------------------
|  1     |    obj1              |
|  2     |    obj2              |
|  3     |    obj3              |


Tabelle Rechte
|------|-----------------|
|  pID  |    Permission       |
--------------------------
|  1     |    per1              |
|  2     |    per2              |


Tabelle Objekte_Rechte
|------|---------|
|  oID  |    pID    |
------------------
|  1     |    1       |
|  1     |    2       |
|  2     |    1       |
Was ich bereits habe, da es ja sehr simpel ist, ist eine Abfrage, mit der ich alle aktuell eingetragenen "Objekte" ausgeben lasse, also im Prinzip
Select Object From Objekte;

Interessant wäre für mich jetzt aber die Zusatzinformation, wieviele Rechte jedem einzelnen Objekt zugeordnet sind (welche ist irrelevant, nur die Anzahl).

Klar, ich könnte jetzt für jedes einzelne Objekt nochmal eine Abfrage mit Count machen, wieviele Rechte dieses Objekt in der Tabelle Objekte_Rechte hat, aber dieser Weg gefällt mir nicht und ich hoffe eigentlich auf einen Tip, wie ich das in einer einzigen Abfrage unterbringen kann und als Ausgabe etwa sowas bekomme:

Code:
|--------|---------|
| Object  |   Count |
------------------
|  obj1    |    2       |
|  obj2    |    1       |
|  obj3    |    0       |
 
#2
Musst doch eigentlich nur nach oID gruppieren und die pID zählen. Wenn du alle Objekte ausgegeben haben willst am besten noch einen äußeren Verbund sprich ungefähr so:
Code:
SELECT oID,COUNT DISTINCT(pID)
FROM Objekte_Rechte
GROUP BY oID
dann hast du alle Rechte pro oID gezählt um die Ausgabe zu kriegen wie du sie angegeben hast müsste es dann insgesamt ungefähr so machen:
Code:
SELECT Objekte.Objekt,temp.Zahl
FROM Objekte LEFT OUTER JOIN
	(SELECT oID,COUNT DISTINCT(pID) AS Zahl
	FROM Objekte_Rechte
	GROUP BY oID) AS temp ON Objekte.oID = temp.oID
Wobei pID wahrscheinlich sowieso nicht für eine oID zweimal vorkommt, also kann man das DISTINCT auch weglassen.
Und man muss jetzt noch beachten, dass für ein Objekt, dass keine Rechte hat nicht die 0 sondern die Nullmarke herauskommen wird.
 
Zuletzt bearbeitet:

GrafZahl

Member of Honour
#3
also den java bezug sehe ich nicht, aber was du suchst klingt nach join + aggregation

Code:
SELECT Objekt, Count(pID) 
FROM Objekte AS t1
LEFT JOIN Objekte_Rechte AS t2 ON t1.oID=t2.oID
GROUP BY Objekt

//
da war doch jemand schneller ...
 
#5
also den java bezug sehe ich nicht, aber was du suchst klingt nach join + aggregation

Code:
SELECT Objekt, Count(pID) 
FROM Objekte AS t1
LEFT JOIN Objekte_Rechte AS t2 ON t1.oID=t2.oID
GROUP BY Objekt

//
da war doch jemand schneller ...
Super, so ungefähr habe ich mir das vorgestellt, teste das heute Abend gleich mal. Meine Lösung hätte dann vermutlich eher wie die von Tsjuder oder noch umständlicher ausgesehen :D

Der Bezug auf Java war auch eigentlich nur deshalb dabei, falls es mit dem JDBC Einschränkungen irgendeiner Art geben sollte, die mir nicht bekannt wären :wink: Da gebe ich dann doch lieber zu viele Infos als zu wenige :)
 
Oben