Anzahl ohne Subquerys

Anzahl ohne Subquerys

am 18.01.2007 09:32:55 von Martin Schneider

Hallo!

Ich habe folgendes, nicht änderbares Design:

Tabelle Produkt:
Id PRIMARY KEY
Name VARCHAR
Original BOOL
Bestell_Nr VARCHAR
....

Tabelle Zubehör:
Id PRIMARY KEY
Name VARCHAR
Produkt INT // Verweis auf Produkt-Tabelle
....

Ich muß nun über den Anfang eines Produkt-Namens (z.B. den erste
Buchstaben) herausfinden, wie viele Zubehörteile es gibt - aber nicht
nur für das Original, sondern auch für den Nachbau. Der Name des
Produkts ist dabei bei Original und Nachbau gleich. Zurückgegeben werden
soll aber IMMER das Original, also in der Art:
Abfrage: Alle Produkte WHERE produkt.name LIKE "A%".

Anzahl ALLER Zubehörteile | Id des Originals | Bestell_Nr des Originals
| ...
Anzahl ALLER Zubehörteile | Id des Originals | Bestell_Nr des Originals
| ...
Anzahl ALLER Zubehörteile | Id des Originals | Bestell_Nr des Originals
| ...

Hat jemand dazu eine Idee? In mehreren Abfragen kriege ich es hin, aber
eleganter und performanter wäre sicherlich eine einzige Abfrage. Problem
ist zusätzlich, dass es unter MySql 4.0.x laufen muß, d.h. Subquerys
fallen leider aus.

Viele Grüße

Martin

Re: Anzahl ohne Subquerys

am 18.01.2007 11:59:21 von Benjamin Billian

Martin Schneider wrote:
> Ich muß nun über den Anfang eines Produkt-Namens (z.B. den erste
> Buchstaben) herausfinden, wie viele Zubehörteile es gibt - aber nicht
> nur für das Original, sondern auch für den Nachbau. Der Name des
> Produkts ist dabei bei Original und Nachbau gleich. Zurückgegeben werden
> soll aber IMMER das Original, also in der Art:
> Abfrage: Alle Produkte WHERE produkt.name LIKE "A%".
>
> Anzahl ALLER Zubehörteile | Id des Originals | Bestell_Nr des Originals
> | ...
> Anzahl ALLER Zubehörteile | Id des Originals | Bestell_Nr des Originals
> | ...
> Anzahl ALLER Zubehörteile | Id des Originals | Bestell_Nr des Originals
> | ...

SELECT p.id, p.bestell_nr, SUM(p.id) AS anzahl FROM produkt AS p GROUP
BY p.name ORDER BY p.original DESC

Damit bekommst du schon mal alle Teile mit dem selben Namen und die
jeweilige nummer vom Originalteil.


SELECT p.id, p.bestell_nr, SUM(z.id) AS anzahl
FROM produkt AS p
JOIN zubehör AS z ON z.produkt = p.id
WHERE p.name LIKE "A%"
GROUP BY p.name
ORDER BY p.original DESC

Und das erfüllt hoffentlich deine Ansprüche. Durch das ORDER sollte
sichergestellt sein, dass das Originalteil oben steht und seine
Bestellnummer bei dem Group erhalten bleibt.

Ungestestet natürlich ;)

MfG, Benjamin