![]() |
Datenbank: MySQL • Version: 5 • Zugriff über: egal, Problem ist die Abfrage :-)
2 SQL-Abfragen kombinieren
Hallo zusammen,
ich schreibe gerade ein Fotoalbum und eine SQL-Abfrage bringt mich zur Verzweiflung: Ich muss folgende 2 Abfragen kombinieren, wobei jeweils nur die Ausgabe-Spalte "count(...)" anders ist - Es sollen also die Spalten Anzahl1 und Anzahl2 nebeneinander in der Ausgabe auftauchen und das innerhalb EINER Anweisung. Diverse Versuche mitteln UNION haben leider nicht funktioniert... 1.
SQL-Code:
2.
SELECT c.id, c.itemname, a.alevel, a.itemname, count(s.id) As Anzahl1
FROM tblcats c LEFT JOIN tblsubcats s ON c.id = s.parentcat INNER JOIN tblaccesslevels a ON c.alevel = a.alevel WHERE s.alevel <= 1 GROUP BY c.itemname
SQL-Code:
Ich hoffe, das Problem ist einigermaßen klar beschrieben und mir kann jemand weiterhelfen. Auf Wunsch schicke ich auch gerne die kompletten Tabellen mit Daten zum
SELECT c.id, c.itemname, a.alevel, a.itemname, count(p.id) As Anzahl2
FROM tblcats c LEFT JOIN tblsubcats s ON c.id = s.parentcat LEFT JOIN tblpics p ON p.parentsubcat = s.id INNER JOIN tblaccesslevels a ON c.alevel = a.alevel WHERE s.alevel <= 1 GROUP BY c.itemname import zu. Grüße, Michael |
Re: 2 SQL-Abfragen kombinieren
Du koenntest dir doch einen VIEW basteln..?
|
Re: 2 SQL-Abfragen kombinieren
Ungetestet (ob MYSql das mit dem Group und nicht-Aggregaten gemischt hinbekommt ist eine andere Sache):
SQL-Code:
SELECT subquery1.Id,
subquery1.citemname, subquery1.level, subquery1.itemname as aitemname, subquery1.Anzahl1, subquery2.Anzahl2 FROM ( SELECT c.id, c.itemname, a.alevel, a.itemname, count(s.id) As Anzahl1 FROM tblcats c LEFT JOIN tblsubcats s ON c.id = s.parentcat INNER JOIN tblaccesslevels a ON c.alevel = a.alevel WHERE s.alevel <= 1 GROUP BY c.itemname ) subquery1 LEFT OUTER JOIN ( SELECT c.id, c.itemname, a.alevel, a.itemname, count(p.id) As Anzahl2 FROM tblcats c LEFT JOIN tblsubcats s ON c.id = s.parentcat LEFT JOIN tblpics p ON p.parentsubcat = s.id INNER JOIN tblaccesslevels a ON c.alevel = a.alevel WHERE s.alevel <= 1 GROUP BY c.itemname ) subquery2 on subquery1.id = subquery2.id |
Re: 2 SQL-Abfragen kombinieren
Würde es so nicht gehen?
SQL-Code:
Falls es nicht hinhaut, schick mal die Daten+Struktur+die richtigen Werte die rauskommen sollen dann würde ich mich dran setzen ^.^
SELECT c.id, c.itemname, a.alevel, a.itemname, count(s.id) As Anzahl1, count(p.id) As Anzahl2
FROM tblcats c LEFT JOIN tblsubcats s ON c.id = s.parentcat LEFT JOIN tblpics p ON p.parentsubcat = s.id INNER JOIN tblaccesslevels a ON c.alevel = a.alevel WHERE s.alevel <= 1 GROUP BY c.itemname |
Re: 2 SQL-Abfragen kombinieren
Vielen Dank für die Antworten!!!
@Union: So ähnlich habe ich das gelöst, die Abfrage werde ich morgen posten (heute habe ich leider keine Zeit mehr...). Das funktioniert einwandfrei, ob die Lösung mit der "Monster"-Query allerdings "sauber" ist, bezweifle ich, daher meine Unsicherheit und meine Frage. @EugenB: Exakt diese Lösung habe ich auch schon versucht, allerdingt "spuckt" mir die Anweisung falsche Werte für die Anzahl der Bilder (count(p.id)) aus. Mir scheint es so, als ob es nicht möglich ist, beide Counts in eine Abfrage zu bringen, da - um die richtigen Werte zu erhalten - verschiedene Gruppierungen notwendig sind. Ich lasse mich aber gerne eines besseren belehren :-) Ich werde Dir morgen per PN die komplette Tabellendefinitionen inkl. Daten als SQL-Export zukommen lassen - Zusammen mit meiner "Muster-Query", welches - so weit ich bei der riesen Query noch durchsteige - korrekte Werte anzeigt. Grüße, SCRaT |
Re: 2 SQL-Abfragen kombinieren
SQL-Code:
SELECT c.id, c.itemname, a.alevel, a.itemname,
s.anzahl AS Anzahl1, p.anzahl As Anzahl2 FROM tblcats c INNER JOIN tblaccesslevels a ON c.alevel = a.alevel LEFT JOIN (SELECT parentcat, COUNT(*) AS anzahl FROM tblsubcats GROUP BY parentcat) s ON c.id = s.parentcat LEFT JOIN (SELECT parentsubcat, COUNT(*) AS anzahl FROM tblpics GROUP BY parentsubcat) p ON s.id = p.parentsubcat WHERE s.alevel <= 1 |
Re: 2 SQL-Abfragen kombinieren
Liste der Anhänge anzeigen (Anzahl: 1)
@Omata: Vielen Dank, die Abfrage sieht vielversprechend leichter aus. Leider kommt der Fehler, dass bei "WHERE s.alevel <= 1" die Spalte s.alevel nicht bekannt sei. Ich werde morgen versuchen, die Abfrage entsprechend anzupassen! Danke!
Anbei habe ich als Anhang meine kompletten Tabellendefinitionen mit Daten (= original-Daten meiner Test-Datenbank, so wie ich sie benutze) beigefügt!!! Hier meine bisherige Abfrage, die - wohl? - funktioniert. Die 3. Abfrage listet alle Bilder auf, welche KEINE Unterkategorie haben, sondern gleich einer Hauptkategorie zugeordnet sind (In diesen Hauptkategorien [denen Bilder direkt zugeordnet sind] dürfen übrigens KEINE Unterkategorien vorhanden sein).
SQL-Code:
Danke nochmals an alle Helfer :-)
SELECT catid, catname, alevel, lastupdate, klicks, alname, max(subcats) as subcats, max(pictures) as pictures
FROM ( SELECT c.id As catid, c.itemname As catname, a.alevel As alevel, c.lastupdate As lastupdate, c.klicks As klicks, a.itemname As alname, 0 as subcats, count(p.id) As pictures FROM tblcats c LEFT JOIN tblsubcats s ON c.id = s.parentcat LEFT JOIN tblpics p ON p.parentsubcat = s.id INNER JOIN tblaccesslevels a ON c.alevel = a.alevel WHERE s.alevel <= 0 GROUP BY c.itemname HAVING alevel <= 0 UNION SELECT c.id As catid, c.itemname As catname, a.alevel As alevel, c.lastupdate As lastupdate, c.klicks As klicks, a.itemname As alname, count(s.id) as subcats, 0 As pictures FROM tblcats c LEFT JOIN tblsubcats s ON c.id = s.parentcat INNER JOIN tblaccesslevels a ON c.alevel = a.alevel WHERE s.alevel <= 0 GROUP BY c.itemname HAVING alevel <= 0 UNION SELECT c.id As catid, c.itemname As catname, a.alevel As alevel, c.lastupdate As lastupdate, c.klicks As klicks, a.itemname As alname, count(s.id) as subcats, count(p.id) As pictures FROM tblcats c LEFT JOIN tblsubcats s ON c.id = s.parentcat LEFT JOIN tblpics p ON c.id = p.parentcat INNER JOIN tblaccesslevels a ON c.alevel = a.alevel WHERE c.alevel <= 0 GROUP BY c.itemname HAVING subcats = 0 ) sq GROUP BY catname SCRaT |
Re: 2 SQL-Abfragen kombinieren
Denke mal ich kann erst morgen testen, wenn ich ne kleinere lösung gefunden habe werde ich se sofort posten ^.^
|
Re: 2 SQL-Abfragen kombinieren
@EugenB: Danke schonmal. Ich denke, Omatas Lösung ist ein sehr guter Ansatz. Habe es auf die schnelle leider nicht geschafft, daß MySQL die Abfrage akzeptiert. Zu viele "Fehler" - zu wenig Zeit heute Abend :-(
SCRaT |
Re: 2 SQL-Abfragen kombinieren
Würde Dir das helfen?
SQL-Code:
Probleme der von Dir gestellten Art löse ich eigentlich immer in dieser Form. Bei Oracle, Postgres und SQL-Server funktioniert das ordentlich (andere Datenbanken habe ich nicht im Zugriff).
SELECT c.id, c.itemname, a.alevel, a.itemname, Sum(Anzahl1) As Anzahl1, Sum(Anzahl2) As Anzahl2
FROM ( SELECT c.id, c.itemname, a.alevel, a.itemname, count(s.id) As Anzahl1, 0 As Anzahl2 FROM tblcats c LEFT JOIN tblsubcats s ON c.id = s.parentcat INNER JOIN tblaccesslevels a ON c.alevel = a.alevel WHERE s.alevel <= 1 GROUP BY c.itemname union all SELECT c.id, c.itemname, a.alevel, a.itemname, 0 as Anzahl 1, count(p.id) As Anzahl2 FROM tblcats c LEFT JOIN tblsubcats s ON c.id = s.parentcat LEFT JOIN tblpics p ON p.parentsubcat = s.id INNER JOIN tblaccesslevels a ON c.alevel = a.alevel WHERE s.alevel <= 1 GROUP BY c.itemname ) intern GROUP BY c.id, c.itemname, a.alevel, a.itemname Zuerst werden die Summen der einen Abfrage gebildet und für die Summe der weiteren Abfrage(n) entsprechende Spalten mit 0 vorbelegt. Die Abfragen werden per Union all zusammengefasst und anschließend werden nochmal Summen über die Zusammenfassung gebildet. Hier werden dann die Anzahlen und ganz viele 0en summiert. Durch's Group By erhält man so einen Einzeiler. Die Abfragen werden aber nicht so komplex sondern bleiben überschaubar. Stephan |
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:58 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz