Forum Doku Wiki Blog

Forumsarchiv 2004, April
MySQL Abfrage über 2 Tabellen

archivierte Beiträge lesen

  1. (DATENBANK) MySQL Abfrage über 2 Tabellen von Kalle, 27. 04. 2004, 16:51

MySQL Abfrage über 2 Tabellen

Der folgende Beitrag wurde am 27. 04. 2004, 16:51 Uhr von Kalle veröffentlicht.

Hilfe,

irgendwie habe ich heute ein Brett vor dem Kopf. Ich möchte freie Stunden für eine Person ermitteln.

In Tabelle "vorh" sind die auf einer Veranstaltung verfügbaren Stunden eines Stundenplans:

std
---
1
2
3
4
5

in Tabelle "verg" die bereits für 300 Personen vergebenen:

pers std
---- ---
4711 2
4711 4
4712 2
4712 5
...

Für Person 4711 sind also die Stunden 1, 3 und 5 noch verfügbar

select vorh.std
from   vorh, verg
where  vorh.std != verg.std AND verg.pers = 4711

ergibt alle möglichen Stunden.

Wo ist mein Denkfehler?

LIebe Grüße aus Worms, Kalle

MySQL Abfrage über 2 Tabellen

Der folgende Beitrag wurde am 27. 04. 2004, 17:09 Uhr von André Laugks veröffentlicht.

Hallo!

> In Tabelle "vorh" sind die auf einer Veranstaltung verfügbaren Stunden eines Stundenplans:
>
> std
> ---
> 1
> 2
> 3
> 4
> 5
>
> in Tabelle "verg" die bereits für 300 Personen vergebenen:
>
> pers std
> ---- ---
> 4711 2
> 4711 4
> 4712 2
> 4712 5
> ...

> Wo ist mein Denkfehler?

Der Denkfehler ist, daß Du Dir nicht alle Stunden anzeigen zu läßt, die es nicht in der Tabelle "verg" gibt.


Schaue Dir mal nach und nach die Ergebnisse der SQL-Statements an.

// 1.
SELECT vorh.std FROM vorh LEFT JOIN verg ON (vorh.std=verg.std);


// 2.
SELECT vorh.std FROM vorh LEFT JOIN verg ON (vorh.std=verg.std) WHERE verg.pers=4711;


// 3.
SELECT vorh.std FROM vorh LEFT JOIN verg ON (vorh.std=verg.std) WHERE verg.pers=4711 AND verg.std IS NULL;





MfG, André Laugks
--
L-Andre @ gmx.de

MySQL Abfrage über 2 Tabellen

Der folgende Beitrag wurde am 27. 04. 2004, 17:53 Uhr von Kalle veröffentlicht.

Hallo André,

> Der Denkfehler ist, daß Du Dir nicht alle Stunden anzeigen zu läßt, die es nicht in der Tabelle "verg" gibt.
>
>
> Schaue Dir mal nach und nach die Ergebnisse der SQL-Statements an.
>
> // 1.
> SELECT vorh.std FROM vorh LEFT JOIN verg ON (vorh.std=verg.std);
>
> // 2.
> SELECT vorh.std FROM vorh LEFT JOIN verg ON (vorh.std=verg.std) WHERE verg.pers=4711;
>
> // 3.
> SELECT vorh.std FROM vorh LEFT JOIN verg ON (vorh.std=verg.std) WHERE verg.pers=4711 AND verg.std IS NULL;
>
Fall 3 zeigt kein Ergebnis. Sorry, der erhoffte Lerneffekt ist ausgeblieben.

Aber immerhin: Ich hatte ein WHERE vor dem JOIN. Weil das eine Fehlermeldung gab, dachte ich, WHERE und JOIN schließen sich aus. Ich brauche ein gutes Nachschlagewerk.

Lieben Gruß, Kalle

MySQL Abfrage über 2 Tabellen

Der folgende Beitrag wurde am 28. 04. 2004, 01:20 Uhr von André Laugks veröffentlicht.

Hallo!


> > // 3.
> > SELECT vorh.std FROM vorh LEFT JOIN verg ON (vorh.std=verg.std) WHERE verg.pers=4711 AND verg.std IS NULL;
> >
> Fall 3 zeigt kein Ergebnis. Sorry, der erhoffte Lerneffekt ist ausgeblieben.

Ich hatte es ungetestet geschrieben:

SELECT vorh.std FROM vorh LEFT JOIN verg ON (vorh.std=verg.std AND verg.pers=4711) WHERE verg.std IS NULL;

Das (... verg.pers=4711) im ON steht ist IMHO nach Standard nicht korrekt, funktioniert aber.



Wenn Du die Tabelle folgendemaßen erweiterst, also was eine Person absolute an Stunden haben kann...


std    pers
---
1      4711
2      4711
3      4711
4      4711
5      4711
1      4711
2      4711
3      4711
4      4711
5      4711


geht es auch so:


SELECT vorh.std, vorh.pers, verg.std, verg.pers
FROM vorh LEFT JOIN verg ON (vorh.std=verg.std AND vorh.pers=verg.pers) WHERE vorh.pers=4711 AND verg.std IS NULL;





MfG, André Laugks
--
L-Andre @ gmx.de

MySQL Abfrage über 2 Tabellen

Der folgende Beitrag wurde am 27. 04. 2004, 18:51 Uhr von Ilja veröffentlicht.

yo,

> irgendwie habe ich heute ein Brett vor dem Kopf. Ich möchte freie Stunden für eine Person ermitteln.

einen outer join über NULL abfragen.

SELECT std FROM vorh LEFT JOIN verg ON (vorh.std=verg.std)
WHERE verg.std IS NULL;

Ilja

© 1998-2013 SELFHTMLImpressumSoftware: Classic Forum 3.4