Frage zu JOIN-Syntax
am 29.12.2006 10:40:15 von Nook
Hallo NG,
ich habe eine Stammdaten-Tabelle "adresse" und 3 Preislisten-Tabellen.
Nun sollen alle Lieferanten angezeigt werden, von denen Preise in einer
oder mehreren Preislisten-Tabellen vorliegt. Gemeinsamer Key ist "gid".
Die Abfrage nur einer Preisliste funkt:
SELECT a.firma, a.ort FROM adresse AS a, preisliste_a AS b WHERE a.status =
'lieferant' AND a.gid = b.gid GROUP BY a.firma
Bei der Abfrage aller 3 Preislisten-Tabellen klappt es aber nicht:
SELECT a.firma, a.ort FROM adresse AS a, preisliste_a AS b, preisliste_b AS
c, preisliste_c AS d WHERE a.status = 'lieferant' AND (a.gid = b.gid OR
a.gid = c.gid OR a.gid = d.gid) GROUP BY a.firma
Bin für jeden Hinweis sehr dankbar!
Allen ein gutes 2007!
Re: Frage zu JOIN-Syntax
am 29.12.2006 11:13:40 von Andreas Kretschmer
Andreas
--
q: why do so many people take an instant dislike to mysql?
a: it saves time (oicu in #postgresql)
Explaining the concept of referential integrity to a mysql user is like
explaining condoms to a catholic (Shadda in #postgresql)
Re: Frage zu JOIN-Syntax
am 29.12.2006 12:00:45 von Johannes Vogel
Hi Michael
Michael Maus wrote:
> ich habe eine Stammdaten-Tabelle "adresse" und 3 Preislisten-Tabellen.
> Nun sollen alle Lieferanten angezeigt werden, von denen Preise in einer
> oder mehreren Preislisten-Tabellen vorliegt. Gemeinsamer Key ist "gid".
> Die Abfrage nur einer Preisliste funkt:
> SELECT a.firma, a.ort FROM adresse AS a, preisliste_a AS b WHERE a.status =
> 'lieferant' AND a.gid = b.gid GROUP BY a.firma
> Bei der Abfrage aller 3 Preislisten-Tabellen klappt es aber nicht:
> SELECT a.firma, a.ort FROM adresse AS a, preisliste_a AS b, preisliste_b AS
> c, preisliste_c AS d WHERE a.status = 'lieferant' AND (a.gid = b.gid OR
> a.gid = c.gid OR a.gid = d.gid) GROUP BY a.firma
> Bin für jeden Hinweis sehr dankbar!
select a.firma, a.ort
from adresse as ad
left join preisliste_a as pa on ad.gid=pa.gid
left join preisliste_b as pb on ad.gid=pb.gid
left join preisliste_c as pc on ad.gid=pc.gid
where pa.gid is not null and pb.gid is not null and pc.gid is not null
and ad.status = 'lieferant';
Natürlich kannst du in MySQL ab 4.1 auch Subqueries benutzen, wie's
Andreas vorschlägt. Vielleicht ist's sogar schneller, weil weniger Daten
gemergt werden müssen. Probier's aus.
ACK an Andreas, bzgl. letztem Abschnitt.
HTH, Johannes
Re: Frage zu JOIN-Syntax
am 30.12.2006 00:22:41 von Nook
> Hi Michael
>
> Michael Maus wrote:
> > ich habe eine Stammdaten-Tabelle "adresse" und 3 Preislisten-Tabellen.
> > Nun sollen alle Lieferanten angezeigt werden, von denen Preise in einer
> > oder mehreren Preislisten-Tabellen vorliegt. Gemeinsamer Key ist "gid".
> > Die Abfrage nur einer Preisliste funkt:
> > SELECT a.firma, a.ort FROM adresse AS a, preisliste_a AS b WHERE
a.status =
> > 'lieferant' AND a.gid = b.gid GROUP BY a.firma
> > Bei der Abfrage aller 3 Preislisten-Tabellen klappt es aber nicht:
> > SELECT a.firma, a.ort FROM adresse AS a, preisliste_a AS b, preisliste_b
AS
> > c, preisliste_c AS d WHERE a.status = 'lieferant' AND (a.gid = b.gid OR
> > a.gid = c.gid OR a.gid = d.gid) GROUP BY a.firma
> > Bin für jeden Hinweis sehr dankbar!
>
> select a.firma, a.ort
> from adresse as ad
> left join preisliste_a as pa on ad.gid=pa.gid
> left join preisliste_b as pb on ad.gid=pb.gid
> left join preisliste_c as pc on ad.gid=pc.gid
> where pa.gid is not null and pb.gid is not null and pc.gid is not null
> and ad.status = 'lieferant';
>
> Natürlich kannst du in MySQL ab 4.1 auch Subqueries benutzen, wie's
> Andreas vorschlägt. Vielleicht ist's sogar schneller, weil weniger Daten
> gemergt werden müssen. Probier's aus.
>
> ACK an Andreas, bzgl. letztem Abschnitt.
>
> HTH, Johannes
Vielen Dank für Deine Hilfe Johannes, mir war die LEFT JOIN Syntax noch
nicht bekannt.
Ich denke es muss dann auch ad.firma und ad.ort heissen, oder?
Gruß, Michael
Re: Frage zu JOIN-Syntax
am 30.12.2006 00:28:40 von Johannes Vogel
Hi Michael
Michael Maus wrote:
> Johannes Vogel wrote:
>> select a.firma, a.ort
>> from adresse as ad
>> left join preisliste_a as pa on ad.gid=pa.gid
>> left join preisliste_b as pb on ad.gid=pb.gid
>> left join preisliste_c as pc on ad.gid=pc.gid
>> where pa.gid is not null and pb.gid is not null and pc.gid is not null
>> and ad.status = 'lieferant';
> Ich denke es muss dann auch ad.firma und ad.ort heissen, oder?
Ja, genau...