Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Denkanstoss bei Verschachtelter MySQL Abfrage (https://www.delphipraxis.net/142070-denkanstoss-bei-verschachtelter-mysql-abfrage.html)

SlaterBenelli 21. Okt 2009 15:14

Datenbank: MySQL • Version: 5 • Zugriff über: Zeos

Denkanstoss bei Verschachtelter MySQL Abfrage
 
Hallo Zusammen,

irgendwie steh ich gerade voll auf dem Schlauch und weis nicht wie ich wo googeln kann...

Ich habe eine Abfrage die mir ständig falsche Daten liefert, aber nur weil da ein "OR" drinn vorkommt, da ich in einer Unterabfrage mehrere Felder aus einer Tabelle als eine "Tabelle" Abfragen will und die in der vorherigen Abfrage brauche.

SQL-Code:
SELECT *
FROM gsreports.daten
where (datum >= "2009-10-12" and datum <= "2009-10-18") and
  (vdn = any (select gsreports.geschaeftsstellen.VDN_Bonn_Intern
        from gsreports.geschaeftsstellen
        where
        VBID = (select gsreports.vbs.ID
        from gsreports.vbs
        where VB = 'West'))) or
  (vdn = any (select gsreports.geschaeftsstellen.VDN_local_Intern
        from gsreports.geschaeftsstellen
        where
        VBID = (select gsreports.vbs.ID
        from gsreports.vbs
        where VB = 'West')))
order by datum, VDN, zeit
in der Tabelle Geschaeftsstellen habe ich zwei spalten die ich beide Abfragen will aber so klappt das irgendwie nicht.

Habe mir schon überlegt das ich das ganze evtl. über eine "Hilfstabelle" lösen will, aber wenn mehr als ein Anwender die Abfrage macht, dann wäre unter Umständen ja schon die Hilfstabelle von jemandem anderen genutzt und mit Daten gefüllt...

Wie kann ich das am gescheitesten Verknüpfen?

SlaterBenelli 21. Okt 2009 15:49

Re: Denkanstoss bei Verschachtelter MySQL Abfrage
 
Ok,

ich habe da jetzt was gefunden und ausprobiert auf meine DB, aber ich bin mir nicht sicher ob dieser Code evtl. irgendwo doch noch hakt und mir nur momentan die richtigen Werte ausspuckt. Momentan sind noch nicht so viele Datensätze in der DB enthalten....

SQL-Code:
SELECT *
FROM gsreports.daten
where
  (vdn = any (select gsreports.geschaeftsstellen.VDN_Bonn_Intern
        from gsreports.geschaeftsstellen
        where
        VBID = (select gsreports.vbs.ID
        from gsreports.vbs
        where VB = 'West')) or
  vdn = any (select gsreports.geschaeftsstellen.VDN_local_Intern
        from gsreports.geschaeftsstellen
        where
        VBID = (select gsreports.vbs.ID
        from gsreports.vbs
        where VB = 'West')))

AND
  datum >= "2009-10-12" and datum <= "2009-10-18" and
    Zeit >= "00:00:00" and Zeit <= "23:59:00"


order by datum, VDN, zeit
Vielleicht gibt es ja hier den einen oder anderen MySQL Spezialisten....

SlaterBenelli 21. Okt 2009 15:52

Re: Denkanstoss bei Verschachtelter MySQL Abfrage
 
ok, das wird wohl die richtige lösung sein... wenn ich den alten Code mit mehreren Klammern noch erweitere liefert der mir die gleichen (richtigen) Werte... Sch... Klammern ;-)


SQL-Code:
SELECT *
FROM gsreports.daten
where (datum >= "2009-10-12" and datum <= "2009-10-18") and
  ((vdn = any (select gsreports.geschaeftsstellen.VDN_Bonn_Intern
        from gsreports.geschaeftsstellen
        where
        VBID = (select gsreports.vbs.ID
        from gsreports.vbs
        where VB = 'West'))) or
  (vdn = any (select gsreports.geschaeftsstellen.VDN_local_Intern
        from gsreports.geschaeftsstellen
        where
        VBID = (select gsreports.vbs.ID
        from gsreports.vbs
        where VB = 'West'))))
order by datum, VDN, zeit

DeddyH 21. Okt 2009 16:02

Re: Denkanstoss bei Verschachtelter MySQL Abfrage
 
Ich weiß nicht genau, ob ich Deine Abfrage richtig verstanden habe, aber kommt hierbei das erwartete Ergebnis?
SQL-Code:
SELECT D.*
FROM gsreports.daten D
JOIN gsreports.geschaeftsstellen G
  ON (G.VDN_Bonn_Intern = D.vdn) OR (G.VDN_local_Intern = D.vdn)
JOIN gsreports.vbs V
  ON V.ID = G.VBID
WHERE V.VB = 'West'
AND D.datum BETWEEN "2009-10-12" AND "2009-10-18"
AND D.Zeit BETWEEN "00:00:00" AND "23:59:00"
ORDER BY D.datum, D.VDN, D.zeit

SlaterBenelli 22. Okt 2009 07:47

Re: Denkanstoss bei Verschachtelter MySQL Abfrage
 
Hi...

@ DeddyH: Ja, das beinhaltet genau die Daten die ich brauchte...

ok, aber was ist der Vorteil bei einer Abfrage wie du sie gemacht hast im vergleich zu meiner die nach den zusätzlichen Klammern auch funktioniert hatte (Deine sieht wesentlich eleganter aus, keine Frage!)?

Gruß

Christian

DeddyH 22. Okt 2009 11:19

Re: Denkanstoss bei Verschachtelter MySQL Abfrage
 
Nun, der erste und entscheidende Vorteil ist, dass das Statement leichter zu lesen und zu begreifen ist. Zum 2. können damit auch ältere MySQL-Versionen vor 4.1 umgehen, die noch keine Sub-Selects unterstützen. Und möglicherweise ist es auch ein wenig performanter, aber das ist reine Spekulation, da ich nicht weiß, wie gut MySQL solche Abfragen wie Deine optimieren kann.


Alle Zeitangaben in WEZ +1. Es ist jetzt 15:13 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