Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi 2 SQL-Abfragen kombinieren (https://www.delphipraxis.net/117938-2-sql-abfragen-kombinieren.html)

scrat1979 28. Jul 2008 18:38

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:
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
2.
SQL-Code:
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
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
import zu.

Grüße,

Michael

Florian H 28. Jul 2008 19:13

Re: 2 SQL-Abfragen kombinieren
 
Du koenntest dir doch einen VIEW basteln..?

Union 28. Jul 2008 20:17

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

EugenB 28. Jul 2008 20:25

Re: 2 SQL-Abfragen kombinieren
 
Würde es so nicht gehen?

SQL-Code:
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
Falls es nicht hinhaut, schick mal die Daten+Struktur+die richtigen Werte die rauskommen sollen dann würde ich mich dran setzen ^.^

scrat1979 29. Jul 2008 19:25

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

omata 29. Jul 2008 19:36

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

scrat1979 29. Jul 2008 20:48

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:
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
Danke nochmals an alle Helfer :-)

SCRaT

EugenB 29. Jul 2008 20:59

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 ^.^

scrat1979 29. Jul 2008 21:43

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

nahpets 30. Jul 2008 08:27

Re: 2 SQL-Abfragen kombinieren
 
Würde Dir das helfen?

SQL-Code:
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
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).
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 07:06 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz