Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   [MySQL] Negative SQL-Abfrage (https://www.delphipraxis.net/75586-%5Bmysql%5D-negative-sql-abfrage.html)

sieppl 21. Aug 2006 23:38


[MySQL] Negative SQL-Abfrage
 
Hi!

Tut mir leid für den schlechten Titel, wusste es nicht besser zu beschreiben..

MySQL 4.0.23
Tabelle A: Bücher (ID, Name)
Tabelle B: Reservierung(Buch_ID, Woche)

Finde alle Bücher, die NICHT in (Kalender-)Woche 38 oder 39 reserviert sind.

Klingt einfach, bekomme es aber einfach nicht hin.
Ich habe schon relativ komplexe QUeries zusammengebaut, hier habe ich aber einfach ein Brett vorm Kopf.
Ich bin für jede Hilfe dankbar.

Grüße

Sebastian

Dax 21. Aug 2006 23:42

Re: [MySQL] Negative SQL-Abfrage
 
Funktioniert es damit?
SQL-Code:
SELECT * FROM `Bücher`, `Reservierungen` WHERE `ID` = `Buch_ID` AND `Woche` <> 38 AND `Woche` <> 39

TBx 21. Aug 2006 23:52

Re: [MySQL] Negative SQL-Abfrage
 
Hallo!

Ich hoffe, das funktioniert in MySQL:

SQL-Code:
select Bücher.Name
  from Bücher
    inner join Reservierung
      on Reservierung.Buch_ID = Bücher.Name
  where not Reservierung.Woche in (38, 39)
  group by Bücher.Name
Das Sollte Dir alle Buchnamen ausgeben, die außerhalb der Wochen 38 und 39 reserviert sind.

SQL-Code:
select Bücher.Name
  from Bücher
  where not exists (select Reservierung.Woche
                      from Reservierung
                      where Reservierung.Buch_ID = Bücher.ID
                        and Reservierung.Woche in (38,39)
                   )
Das sollte Dir alle Bücher des Bestandes ausgeben, die in der Wochen 38 und 39 nicht reserviert sind und somit noch zur Verfügung stehen.

Ich hoffe, Dir hilft das weiter, ich arbeite selbst mit Firebird und MSSQL. MySQL habe ich bisher noch nicht benutzt.

Gruß

onlinekater

PS: Codes runtergetippt, nicht getestet

PPS: Trotz roten Kastens, da mein Beitrag mehr Möglichkeiten aufzeigt
[Edit] Ich gehe mal davon aus, dass mein zweiter Codeschnippsel das Passende ist. [/Edit]

sieppl 21. Aug 2006 23:54

Re: [MySQL] Negative SQL-Abfrage
 
Zitat:

Zitat von Dax
Funktioniert es damit?
SQL-Code:
SELECT * FROM `Bücher`, `Reservierungen` WHERE `ID` = `Buch_ID` AND `Woche` <> 38 AND `Woche` <> 39

Damit setzt du voraus, dass es Reservierungen gibt. Es kann ja auch sein, dass in der Reservierungstabelle ein Buch garnicht auftaucht.

Dax 21. Aug 2006 23:58

Re: [MySQL] Negative SQL-Abfrage
 
Hm, stimmt...

So besser?
SQL-Code:
SELECT * FROM `Bücher` LEFT JOIN `Reservierungen` ON `ID` = `Buch_ID` WHERE `Woche` <> 38 AND `Woche` <> 39

TBx 22. Aug 2006 00:02

Re: [MySQL] Negative SQL-Abfrage
 
@dax: Das zeigt Dir nun alle Bücher und alle Reservierungen außerhalb der Wochen 38 und 39 an

Gruß

onlinekater

Dax 22. Aug 2006 00:09

Re: [MySQL] Negative SQL-Abfrage
 
Oh :( Ich dachte, ein Left Join, bei dem Bedingung nicht erfüllt ist, füllt die Spalten, für die es keine Daten gibt, mit NULL..

sieppl 22. Aug 2006 00:12

Re: [MySQL] Negative SQL-Abfrage
 
Zitat:

Zitat von onlinekater

SQL-Code:
select Bücher.Name
  from Bücher
    inner join Reservierung
      on Reservierung.Buch_ID = Bücher.Name
  where not Reservierung.Woche in (38, 39)
  group by Bücher.Name
Das Sollte Dir alle Buchnamen ausgeben, die außerhalb der Wochen 38 und 39 reserviert sind.

SQL-Code:
select Bücher.Name
  from Bücher
  where not exists (select Reservierung.Woche
                      from Reservierung
                      where Reservierung.Buch_ID = Bücher.ID
                        and Reservierung.Woche in (38,39)
                   )
[/Edit]

Der obere Query läuft mit mit Klammern um die Bedingung hinter dem AND. Der untere nicht, da in MySql 4.0.23 noch keine SubQueries möglich sind. ;)

sieppl 22. Aug 2006 00:14

Re: [MySQL] Negative SQL-Abfrage
 
Zitat:

Zitat von Dax
Oh :( Ich dachte, ein Left Join, bei dem Bedingung nicht erfüllt ist, füllt die Spalten, für die es keine Daten gibt, mit NULL..

Ja, dem ist auch so. Das bringt mich aber nicht weiter, da damit dann zwar alle Bücher filtern könnte, die gar keine Reservierung haben, aber eben nicht diejenigen, die in bestimmmten Kalenderwochen noch frei sind.

TBx 22. Aug 2006 00:16

Re: [MySQL] Negative SQL-Abfrage
 
@dax: ja, das siehst Du richtig.

Als Ergebnis bekommst Du dann z.B. Folgendes:

Bücher:
Zitat:

1 : Delphi
2 : Visual Basic
3 : SQL
4 : Together
Reservierungen
Zitat:

1 : 31
1 : 33
1 : 38
3 : 39
4 : 52
4 : 38
Ergebnis:
Zitat:

1 : Delphi : 1 : 31
1 : Delphi : 1 : 33
1 : Delphi : null : null
2 : Visual Basic : null : null
3 : SQL : null : null
4 : Together : 4 : 52
4 : Together : null : null

sieppl 22. Aug 2006 00:18

Re: [MySQL] Negative SQL-Abfrage
 
Mmh, um den Subquery zu umschiffen packe ich den inneren Select in eine temporäre Tabelle. Ich hoffe ich kann auf diese dann irgendwie das "NOT EXISTS" anwenden.. EDIT: :wall: Nö. "EXISTS" gehört natürlich zu den SubQueries. Wird wohl schwierig den Provider zu einer Änderung zu bewegen.

TBx 22. Aug 2006 00:36

Re: [MySQL] Negative SQL-Abfrage
 
Hallo!

Noch ein Versuch!

SQL-Code:
select bücher.name
  from bücher
    left outer join reservierungen
      on reservierungen.buch_id = bücher.id
      and reservierungen.woche in (38, 39)
  where reservierungen.woche is null
  group by bücher.name
Mit Firebird 2.0 klappts (Hab da nur Bücher in buecher umbenannt).

Geht das mit MySQL auch?

Gruß

onlinekater

sieppl 22. Aug 2006 09:01

Re: [MySQL] Negative SQL-Abfrage
 
Zitat:

Zitat von onlinekater
Hallo!
SQL-Code:
select bücher.name
  from bücher
    left outer join reservierungen
      on reservierungen.buch_id = bücher.id
      and reservierungen.woche in (38, 39)
  where reservierungen.woche is null
  group by bücher.name
Mit Firebird 2.0 klappts (Hab da nur Bücher in buecher umbenannt).

Geht das mit MySQL auch?

Moin! Das geht mit MySql auch und sieht schon sehr gut aus. Das Problem ist nur noch, dass wenn ein Buch in KW 38 reserviert ist, aber in KW 39 noch frei nicht angezeigt wird. Wenn man das hinbekommt, sollte auch ein Eintrag ob das Buch in KW 38, 39 oder beiden frei ist nicht schwer sein. :) Ich werde mal ein wenige rumspielen, danke für den Ansatz!

sieppl 22. Aug 2006 09:17

Re: [MySQL] Negative SQL-Abfrage
 
SQL-Code:
select bücher.name, "KW 38 frei"
  from bücher
    left outer join reservierungen
      on reservierungen.buch_id = bücher.id
      and reservierungen.woche = 38
  where reservierungen.woche is null
  group by bücher.name
UNION
select bücher.name, "KW 39 frei"
  from bücher
    left outer join reservierungen
      on reservierungen.buch_id = bücher.id
      and reservierungen.woche = 39
  where reservierungen.woche is null
  group by bücher.name
So klappt es! Vielen Dank! Mein Fehler war es die Bedingung mit der KW in die WHERE-Klausel zu setzen anstatt in die JOIN-Bedingung. Wieder was gelernt.

DP-Maintenance 22. Aug 2006 14:09

DP-Maintenance
 
Dieses Thema wurde von "Jelly" von "Programmieren allgemein" nach "Datenbanken" verschoben.
Dank an Thorben77. Definitiv falsche Sparte


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