Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi MySQL anfrage erstellen. (https://www.delphipraxis.net/123194-mysql-anfrage-erstellen.html)

shifter 29. Okt 2008 06:06

Datenbank: MySQL • Zugriff über: zeos lib

MySQL anfrage erstellen.
 
Hallo zusammen,

habe folgende scenario.

TABELLE 1
Ist ne personal samlung wie z.b.

PersonalNr, Name, Vorname ...

TABELLE 2
Ist Abwesenheits liste ( Urloub, Dienstreise, Krank ... )
PersonalNr, Datum_von, Datum_bis ...



Versuche jezt anfrage erstellen die mir auflistet Mitarbeiter die am Datum zur verfügung stehen.
Er solle alle Leute auflisten die nicht Krank, Urlaub etc. sind.


Habe versucht mit

SELECT a.*, b.Pnr, b.Datum_von, b.Datum_bis FROM (personal a) LEFT JOIN abw_liste b ON (a.pnr=b.pnr) WHERE b.datum_von<="2008-11-02" AND b.datum_bis>="2008-10-27" ...


Leider komm ich nicht zur gewünschten ergebnis.
Er listet mir entweder die leute auf die nicht dar sind oder garnichts.


Kann mir jemand helfen ?

mfg
shifter

DeddyH 29. Okt 2008 07:23

Re: MySQL anfrage erstellen.
 
Datum_von muss doch kleiner sein als Datum_bis, oder nicht? Versuch es mal so:
SQL-Code:
SELECT P.* 
FROM Personal P
LEFT JOIN Abwesenheit A ON A.PersonalNr = P.PersonalNr
                        AND A.Datum_von >= '2008-11-02'
                        AND A.Datum_bis <= '2008-11-05'
WHERE A.PersonalNr IS NULL

Xong 29. Okt 2008 08:26

Re: MySQL anfrage erstellen.
 
Ich bin mir nicht sicher, aber DeddyHs Vorschlag müsste falsch sein.
Bei einem Fehlzeitraum 2008-11-03 bis 2008-11-07 ergibt sich aus
SQL-Code:
A.Datum_von >= '2008-11-02'
AND A.Datum_bis <= '2008-11-05'
SQL-Code:
TRUE
AND FALSE
= FALSE
Damit wäre beim LEFT OUTER JOIN A.PersonalNr = NULL.
Der Mitarbeiter würde also selektiert werden, obwohl er nicht einsetzbar wäre.

Vorgehensweise:
Code:
Gib mir alle Spalten
aus Tabelle Personal
wo PersonalNr nicht in
    ( Gib mir alle PersonalNr
      aus Abwesenheitsliste
      wo Einsatzzeitraum in Fehlzeitraum fällt
    )
Mein Vorschlag:
SQL-Code:
SELECT P.*
FROM Personal P
WHERE P.PersonalNr != ALL (
    SELECT PersonalNr
    FROM abw_liste
    WHERE ( datum_von>=VON_WANN AND datum_von<=BIS_WANN ) OR
          ( datum_bis>=VON_WANN AND datum_bis<=BIS_WANN )
)
Übrigens solltest du Projektionen immer ausschreiben, also nicht den *-Operator nutzen.

LG,
Xong

PS: Ich hoffe, ich habe keine Fehler gemacht. :duck:

DeddyH 29. Okt 2008 08:35

Re: MySQL anfrage erstellen.
 
OK, an Überlappung hab ich nicht gedacht. Dann mal anders formuliert (irgendein Vorschlag wird dann ja mal hoffentlich der richtige sein):
SQL-Code:
SELECT P.*
FROM Personal P
LEFT JOIN Abwesenheit A ON A.PersonalNr = P.PersonalNr
                        AND (
                             A.Datum_von BETWEEN '2008-11-02' AND '2008-11-05'
                          OR A.Datum_bis BETWEEN '2008-11-02' AND '2008-11-05'
                          OR (A.Datum_von <= '2008-11-02' AND A.Datum_bis >= '2008-11-05')
                            )
WHERE A.PersonalNr IS NULL

Xong 29. Okt 2008 08:41

Re: MySQL anfrage erstellen.
 
Zitat:

Zitat von DeddyH
OK, an Überlappung hab ich nicht gedacht. Dann mal anders formuliert (irgendein Vorschlag wird dann ja mal hoffentlich der richtige sein):

:mrgreen:

Zitat:

Zitat von DeddyH
SQL-Code:
SELECT P.*
FROM Personal P
LEFT JOIN Abwesenheit A ON A.PersonalNr = P.PersonalNr
                        AND (
                             A.Datum_von BETWEEN '2008-11-02' AND '2008-11-05'
                          OR A.Datum_bis BETWEEN '2008-11-02' AND '2008-11-05'
                          OR (A.Datum_von <= '2008-11-02' AND A.Datum_bis >= '2008-11-05')
                            )
WHERE A.PersonalNr IS NULL

Ich habe jetzt keine Möglichkeit, die Abfrage zu testen, aber muss ich in die Projektionsliste nicht auch noch A.PersonalNr aufnehmen, damit ich in der WHERE-Klausel darauf zugreifen kann?
Weiß nicht, wie MySQL damit umgeht...

LG,
Xong

DeddyH 29. Okt 2008 08:43

Re: MySQL anfrage erstellen.
 
Nö, wieso? Hab auch zur Kontrolle nochmal hier nachgesehen: http://www.sql-tips.de/mediawiki/ind...von_Subselects

Xong 29. Okt 2008 08:46

Re: MySQL anfrage erstellen.
 
Zitat:

Zitat von DeddyH
Nö, wieso? Hab auch zur Kontrolle nochmal hier nachgesehen: http://www.sql-tips.de/mediawiki/ind...von_Subselects

Ja, hast recht. Hab mich kurz verwirren lassen...

shifter 29. Okt 2008 13:11

Re: MySQL anfrage erstellen.
 
Hi leute ,
bin gerade aus dem bett rausgekrochen :lol:

Danke erstmal für eure Hilfe.

@DeddyH : Versuche dein Code durchzutesten, jedoch irgend wo befindet sich noch ein hacken.
Dazu aber gleich mehr.

gruss
shifter

shifter 29. Okt 2008 13:18

Re: MySQL anfrage erstellen.
 
Hi,

von wegen ein Hacken.

ES FUNKTIONIERT 100%-ig.

Danke Sehr für eure Mühe und Hilfe.

MfG
Sebastian Launer


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