AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi 2 SQL-Abfragen kombinieren

2 SQL-Abfragen kombinieren

Ein Thema von scrat1979 · begonnen am 28. Jul 2008 · letzter Beitrag vom 3. Aug 2008
Antwort Antwort
Seite 1 von 2  1 2   
Benutzerbild von scrat1979
scrat1979

Registriert seit: 12. Jan 2007
Ort: Sulzbach a.d. Murr
1.026 Beiträge
 
Delphi 10.4 Sydney
 
#1

2 SQL-Abfragen kombinieren

  Alt 28. Jul 2008, 19:38
Datenbank: MySQL • Version: 5 • Zugriff über: egal, Problem ist die Abfrage :-)
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
Michael Kübler
  Mit Zitat antworten Zitat
Florian H

Registriert seit: 30. Mär 2003
Ort: Mühlacker
1.043 Beiträge
 
Delphi 6 Professional
 
#2

Re: 2 SQL-Abfragen kombinieren

  Alt 28. Jul 2008, 20:13
Du koenntest dir doch einen VIEW basteln..?
Florian Heft
  Mit Zitat antworten Zitat
Benutzerbild von Union
Union

Registriert seit: 18. Mär 2004
Ort: Luxembourg
3.487 Beiträge
 
Delphi 7 Enterprise
 
#3

Re: 2 SQL-Abfragen kombinieren

  Alt 28. Jul 2008, 21:17
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
Ibi fas ubi proxima merces
sudo /Developer/Library/uninstall-devtools --mode=all
  Mit Zitat antworten Zitat
EugenB

Registriert seit: 7. Dez 2006
98 Beiträge
 
Lazarus
 
#4

Re: 2 SQL-Abfragen kombinieren

  Alt 28. Jul 2008, 21:25
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 ^.^
  Mit Zitat antworten Zitat
Benutzerbild von scrat1979
scrat1979

Registriert seit: 12. Jan 2007
Ort: Sulzbach a.d. Murr
1.026 Beiträge
 
Delphi 10.4 Sydney
 
#5

Re: 2 SQL-Abfragen kombinieren

  Alt 29. Jul 2008, 20:25
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
Michael Kübler
  Mit Zitat antworten Zitat
omata

Registriert seit: 26. Aug 2004
Ort: Nebel auf Amrum
3.154 Beiträge
 
Delphi 7 Enterprise
 
#6

Re: 2 SQL-Abfragen kombinieren

  Alt 29. Jul 2008, 20:36
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
  Mit Zitat antworten Zitat
Benutzerbild von scrat1979
scrat1979

Registriert seit: 12. Jan 2007
Ort: Sulzbach a.d. Murr
1.026 Beiträge
 
Delphi 10.4 Sydney
 
#7

Re: 2 SQL-Abfragen kombinieren

  Alt 29. Jul 2008, 21:48
@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
Angehängte Dateien
Dateityp: txt tables_and_data_184.txt (7,9 KB, 4x aufgerufen)
Michael Kübler
  Mit Zitat antworten Zitat
EugenB

Registriert seit: 7. Dez 2006
98 Beiträge
 
Lazarus
 
#8

Re: 2 SQL-Abfragen kombinieren

  Alt 29. Jul 2008, 21:59
Denke mal ich kann erst morgen testen, wenn ich ne kleinere lösung gefunden habe werde ich se sofort posten ^.^
  Mit Zitat antworten Zitat
Benutzerbild von scrat1979
scrat1979

Registriert seit: 12. Jan 2007
Ort: Sulzbach a.d. Murr
1.026 Beiträge
 
Delphi 10.4 Sydney
 
#9

Re: 2 SQL-Abfragen kombinieren

  Alt 29. Jul 2008, 22:43
@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
Michael Kübler
  Mit Zitat antworten Zitat
nahpets
(Gast)

n/a Beiträge
 
#10

Re: 2 SQL-Abfragen kombinieren

  Alt 30. Jul 2008, 09:27
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
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2   

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:49 Uhr.
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