Und-Verknuepfung / MySQL 4.0

Und-Verknuepfung / MySQL 4.0

am 01.10.2006 11:01:05 von Frederik Ramm

Hallo,

gegeben sei das folgende (auf das wesentliche heruntergekochte und
hypothetische)Datenmodell einer Rezept-Datenbank:

create table zutaten
(
gericht varchar(64),
zutat varchar(64),
menge_benoetigt integer
);

Anhand einer Tabelle ueber die Vorratshaltung...

create table vorrat
(
zutat varchar(64),
vorrats_ort varchar(64),
menge_vorhanden integer
);

.... soll nun ein Query gefunden werden, der die Namen aller Gerichte
ausgibt, die aufgrund der bestehenden Vorraete hergestellt werden koen-
nen. Leider steht nur MySQL 4.0 zur Verfuegung, und Sub-Selects scheiden
daher aus.

Testdaten:

insert into zutaten values
("kuchen", "mehl", 500),
("kuchen", "ei", 4),
("kuchen", "butter", 250),
("cremespeise", "ei", 2),
("cremespeise", "milch", 1),
("cremespeise", "zitrone", 1);

insert into vorrat values
("ei", "kuehlschrank", 4),
("milch", "kuehlschrank", 4),
("butter", "kuehlschrank", 500),
("zitrone", "keller", 2),
("zitrone", "kueche", 1),
("mehl", "kueche", 2000);

Hat jemand eine Idee? Ich habe bislang nichts gefunden, was nicht
furchtbar schlimm ist, man muss dann halt vom Programm aus mehrere
Queries hintereinander machen... aber cooler waere es natuerlich
schon, wenn es in einem ginge...

Bye
Frederik

--
Frederik Ramm ## eMail frederik@remote.org ## N49°00.22' E008°24.56'

Re: Und-Verknuepfung / MySQL 4.0

am 01.10.2006 13:11:28 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: Und-Verknuepfung / MySQL 4.0

am 01.10.2006 14:11:12 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: Und-Verknuepfung / MySQL 4.0

am 01.10.2006 19:37:06 von Frederik Ramm

Andreas Kretschmer wrote:
> Was schon mal recht schlecht ist, kein normalisiertes Datenmodel.

In der "realen" Anwendung, bei der das Problem auftritt, ist das
alles etwas komplizierter, normalisiert und selbstverstaendlich mit
numerischen IDs und so weiter. Und in der realen Anwendung geht es
auch nicht um Rezepte. Ich hatte fuer diese Anfrage hier absichtlich
eine Analogie verwendet, die sehr simpel ist, aber dennoch das Grund-
problem erhaelt, so dass sich niemand erst in mein Fach-Datenmodell
einarbeiten muss. Aus dem gleichen Grund habe ich darauf verzichtet,
irgnedwelche Keys und Indizes aufzulisten; sie spielen fuer die Frage
keine Rolle.

Leider habe ich - ich dachte, darauf haette ich hingewiesen - im kon-
kreten Fall nicht einmal die Moeglichkeit, von MySQL 4.0 auf 4.1 zu
wechseln, obwohl die Sache mit Sub-Selects (und nichts anderes hast
Du hier in Deinem View verwendet) sehr einfach und elegant zu loesen
waere. Ein Wechsel auf PostgresQL ist mir - vielleicht haette ich das
explizit dazusagen sollen - ebensowenig moeglich.

> Das ist PostgreSQL, sollte sich aber mit den left joins auch auf MySQL
> abbilden lassen.

Genau das war der Kern meiner Frage - wie bilde ich das mit den Bord-
mitteln von MySQL 4.0 ab. Dass es ab 4.1, ebenso wie mit Oracle, In-
formix oder PostgresQL leicht loesbar ist, stand nicht in Frage.

Trotzdem Danke fuer Deinen unterhaltsamen Exkurs.

Bye
Frederik

--
Frederik Ramm ## eMail frederik@remote.org ## N49°00.22' E008°24.56'

Re: Und-Verknuepfung / MySQL 4.0

am 01.10.2006 20:13:40 von dnoeth

Frederik Ramm wrote:

> Genau das war der Kern meiner Frage - wie bilde ich das mit den Bord-
> mitteln von MySQL 4.0 ab.

Indem du den Quelltext der View mit in die Abfrage einbaust.

Für meine Schulungen nehme ich gerne eine Pizza-Datenbank, da lautet
eine mögliche Lösung:

select
p.Pizza#
,p.PizzaName
from
Pizzas P
join
PizzaToppings PT on P.Pizza# = PT.Pizza#
join Toppings Z on PT.Topping# = T.Topping#
left join available_Toppings a on a.Topping = T.Topping
group by p.Pizza#, p.PizzaName
having
count(*) = count(a.Topping)
;

Deine Tabelle vorrat wäre hier die available_Topings, der Rest die
normalisierten Zutaten.

Dieter

Re: Und-Verknuepfung / MySQL 4.0

am 01.10.2006 21:45:50 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: Und-Verknuepfung / MySQL 4.0

am 02.10.2006 15:11:04 von Frederik Ramm

Dieter Noeth wrote:
> Für meine Schulungen nehme ich gerne eine Pizza-Datenbank, da lautet
> eine mögliche Lösung:

[...]

> Deine Tabelle vorrat wäre hier die available_Topings, der Rest die
> normalisierten Zutaten.

Ich habe da einen Knoten im Kopf. So weit komme ich ja noch:

mysql> select gericht from zutaten left join vorrat on zutaten.zutat =
vorrat.zutat group by gericht having count(gericht)=count(vorrat.zutat);

+-------------+
| gericht |
+-------------+
| cremespeise |
| kuchen |
+-------------+

Das beruecksichtigt aber jetzt noch nicht die erforderlichen Mengen.
Also schreibe ich

mysql> select gericht from zutaten left join vorrat on zutaten.zutat =
vorrat.zutat and zutaten.menge_benoetigt <= vorrat.menge_vorhanden group
by gericht having count(gericht)=count(vorrat.zutat);

Aber dies fuehrt ja dazu, dass eine insgesamt ausreichende Menge einer
Zutat, die auf verschiedene Lagerorte verteilt ist, nicht erkannt wird,
weil kein einzelner Record der Tabelle vorrat allein die Bedingung
"zutaten.menge_benoetigt <= vorrat.menge_vorhanden" erfuellt. Zwar kann
ich die Gesamtsummen der verfuegbaren Zutaten so ermitteln:

select sum(menge_vorhanden), zutat from vorrat group by zutat;

Doch gelingt es mir nicht, dieses "group by zutat" mit dem "group by
gericht" von oben (das ja erforderlich ist, um nachzupruefen, dass
auch alle Zutaten vorhanden sind) in einem Query zu kombinieren.

Bye
Frederik

--
Frederik Ramm ## eMail frederik@remote.org ## N49°00.22' E008°24.56'

Re: Und-Verknuepfung / MySQL 4.0

am 03.10.2006 14:12:10 von frank paulsen

Andreas Kretschmer writes:

> Im übrigen tust Du mir mit Deiner Drittklassewelt-Software auch nicht
> weiter leid, unbeachtet der Tatsache, das diese JOIN wohl kann. Oder
> etwa nicht?

dass du waehrend des wartens auf dein Performance Grab hinreichend
viel zeit hast, hier beliebig unsinnige artikel abzusetzen, ist
wahrscheinlich nicht mal vorwerfbar. nur hofft man halt, dass du
endlich pubertierst.

--
frobnicate foo