[MySQL 4.0] Definieren von Variablen in einem Query
Yadgar
- datenbank
High!
Und weiter geht es mit der Greenbook-E-Orgeldatenbank... jetzt knobele ich an einem Query, der alle zweimanualigen Orgeln mit ungleichen Manualen (z. B. unten 37, oben 49 Tasten) anzeigen soll.
Dazu müssten für jede zweimanualige Orgel von den drei Einträgen (Pedal, unteres Manual, oberes Manual) in der vermittelnden Referenztabelle orgeln_klaviaturen die Einträge für das untere und obere Manual bezüglich des jeweiligen Wertes in der Spalte "Anzahl_Tasten" (die wiederum zur Stammdatentabelle "klaviaturen" gehört) verglichen werden. Nur: geht das überhaupt, ohne im Query selbst Variablen zu definieren?
Mein MySQL 4.0-Lehrbuch (Anthony Butcher, Markt & Technik-Verlag) schweigt sich zu diesem Thema aus...
Bis bald im Khyberspace!
Yadgar
yo,
Und weiter geht es mit der Greenbook-E-Orgeldatenbank...
und wie immer wäre es gut dazu deine version des mysql-servers zu kennen, dein tabellendesign und beispieldaten mit dem ergebnis, was rauskommen soll.
Mein MySQL 4.0-Lehrbuch (Anthony Butcher, Markt & Technik-Verlag) schweigt sich zu diesem Thema aus...
das buch scheint ein wenig veraltet zu sien, was die version angeht. wenn du eine 4.1 oder höcher hast, würde ich mir ein neues zulegen.
Ilja
High!
und wie immer wäre es gut dazu deine version des mysql-servers zu kennen, dein
Bitteschön: 4.0.25!
tabellendesign und beispieldaten mit dem ergebnis, was rauskommen soll.
Hier im Forum? Das wird aber länglich... willst du das wirklich? Ich bin eigentlich davon ausgegangen, dass meine Beschreibung schon ausreicht...
Na gut:
Tabelle "orgeln" enthält 45 Spalten, relevant sind hier aber nur die Spalten "Nr", "Marke" und "Modell". "Nr" ist der Primärschlüssel, "Marke" referenziert die Tabelle "marken", "Modell" ist ein VARCHAR-Feld, das im Klartext den Modellnamen der jeweiligen Orgel enthält.
Tabelle "marken" besteht nur aus der Spalte "Nr" (Primärschlüssel) und "Markenname" (VARCHAR, Klartext).
Tabelle "klaviaturen" erfaßt alle vorkommenden Typen von Manualen und Pedalen; sie besteht aus den Spalten Klaviatur_Nr (Primärschlüssel), Position (0=Pedal, 1=unteres Manual, 2=oberes Manual, 3=drittes Manual, 4=viertes Manual), Tiefste_Taste, Hoechste_Taste, Anzahl_Tasten, Bauart (z. B. Stummelpedal, Vollpedal, vorspringende Tastatur, Waterfall-Tastatur...).
Eine Orgel ist per definitionem ein Instrument, das mit beiden Händen und beiden Füßen gespielt wird, hat also auf jeden Fall ein Pedal und mindestens ein Manual (andernfalls wäre jedes x-beliebige Keyboard und jedes Gebläse-Kinderspielzeug ebenfalls eine Orgel... dann würde das Projekt völlig unüberschaubar werden, zu den schätzungsweise 10000 Orgelmodellen seit der allerersten Hammond von 1935 kämen mindestens noch einmal 10000 "Tischhupen" hinzu...)
Zwischen "orgeln" und "klaviaturen" besteht folglich eine n:n-Beziehung, also muss eine vermittelnde Relationstabelle her: orgeln_klaviaturen.
In orgeln_klaviaturen hat demnach jede Orgel mindestens zwei (Pedal und erstes Manual), maximal fünf (Orgeln mit mehr als vier Manualen sind nie serienmäßig gebaut worden) Einträge.
In meinem Query-Problem geht es jetzt darum, zweimanualige Orgeln zu finden, bei denen das untere Manual eine andere Tastenzahl hat als das obere, wo also der Eintrag bei Position=1 in Anzahl_Tasten einen anderen Wert hat als der Eintrag bei Position=2... und irgendwie kann ich mir nicht vorstellen, dass dies ohne (vorherige?) Deklaration von Variablen gehen soll!
das buch scheint ein wenig veraltet zu sien, was die version angeht. wenn du eine 4.1 oder höcher hast, würde ich mir ein neues zulegen.
Für den Remote-Server (siehe oben) reicht es in der Tat aus, lokal verwende ich allerdings 5.0 (genauer: 5.0.38)!
Bis bald im Khyberspace!
Yadgar
Now playing: Neumond (Novalis)
yo,
Hier im Forum? Das wird aber länglich... willst du das wirklich? Ich bin eigentlich davon ausgegangen, dass meine Beschreibung schon ausreicht...
deine beschreibungen im ausgangsposting reichen bei weiten nicht, auch hier hast du wieder ein paar hinwesie unterlassen, die uns das leben leichter machen würden. sehr hilfreich sind immer besipiel-daten und dann die gewünschte ergebnismenge aufzuzeigen. das hast du leider vergessen.
mal von der abfrage abgesehen, sind mir ein paar dinge aufgefallen, die für dich nützlich sein könnten.
Tabelle "klaviaturen" erfaßt alle vorkommenden Typen von Manualen und Pedalen; sie besteht aus den Spalten Klaviatur_Nr (Primärschlüssel),
du benutzt in einigen tabellen als PK die bezeichnung NR, hier aber tabellenname_NR. ich würde mich für einen weg entscheiden.
Zwischen "orgeln" und "klaviaturen" besteht folglich eine n:n-Beziehung, also muss eine vermittelnde Relationstabelle her: orgeln_klaviaturen.
eine relationstabelle gibt es nicht. es ist ein weit vebreiteter irrlgaube, dass mit relation eine beziehung in kontext von datenbanken gemeint ist. in wirklichkeit ist relation ein anderes wort für tabelle, also relation = tabelle.
nun aber zu deinem eigentlichen problem. du benutzt eine version kleiner als 4.1, das hat einen sehr, sehr grossen nachteil, weil damit dein server keine unterabfragen kann. sicherlch läßt sich für dein problem eine abfrage finden, ABER die möglichkeit unterabfragen zu benutzen wird immer wieder auf dich zukommen. insofern mein tipp an dich, bevor man hier nach einer abfrage sucht, dein projekt auf einen server in version 4.1 oder höher zu benutzen. wenn dies nicht geht (das sollte aber dann schon sehr gute gründe sein), dann poste hier noch mal dein problem mit beispiel-daten und wir finden eine lösung.
Ilja
High!
deine beschreibungen im ausgangsposting reichen bei weiten nicht, auch hier hast du wieder ein paar hinwesie unterlassen, die uns das leben leichter machen würden. sehr hilfreich sind immer besipiel-daten und dann die gewünschte ergebnismenge aufzuzeigen. das hast du leider vergessen.
Na schön... here we go:
Tabelle "orgeln":
Nr Marke Modell
1 3 B-3
2 5 Harmonie
3 7 Excelsior
4 8 Symphonie D 98
5 9 370.26
6 1 Nuit Electronique
7 3 A-100
8 2 X-705
9 10 D-85
Tabelle "klaviaturen"
Nr Position Tiefste_Taste Höchste_Taste Anzahl_Tasten Bauart
1 0 C c 13 Stummel
2 0 C c1 25 Parallel
3 0 C c1 25 Radial
4 0 C f1 30 BDO
5 0 C g1 32 AGO
6 1 C c4 61 Waterfall
7 1 C h3 60 vorspringend
8 1 C c3 49 vorspringend
9 1 F c3 44 vorspringend
10 1 c c3 37 vorspringend
11 1 F a2 41 vorspringend
12 2 C c4 61 Waterfall
13 2 c c4 49 vorspringend
14 2 f c4 44 vorspringend
15 2 c1 c4 37 vorspringend
16 3 c1 c4 37 vorspringend
Tabelle "marken"
Nr Markenname
1 Eminent
2 Elka
3 Hammond
4 Kimball
5 Gerland
6 Wurlitzer
7 Zachanos
8 Hohner
9 Bontempi
10 Yamaha
Tabelle "orgeln_klaviaturen"
Nr Orgel-Nr Klaviatur-Nr
1 1 3
2 1 6
3 1 12
4 2 1
5 2 9
6 2 14
7 3 2
8 3 7
9 3 8
10 4 1
11 4 8
12 4 13
13 5 1
14 5 10
15 5 15
16 6 1
17 6 11
18 6 14
19 7 3
20 7 6
21 7 12
22 8 1
23 8 8
24 8 13
25 9 1
26 9 8
27 9 13
28 9 16
Gesucht werden alle zweimanualigen Orgeln, deren oberes und unteres Manual unterschiedliche Tastenzahlen haben. Die Ausgabetabelle sollte so aussehen:
Marke Modell
Zachanos Excelsior
Eminent Nuit Electronique
Die "Zachanos Excelsior" hat im unteren Manual 49, im oberen 61 Tasten; die "Eminent Nuit Electronique" hat im unteren Manual 41, im oberen 44 Tasten.
Die Yamaha D-85 wird von der Auswahl nicht erfaßt, da sie zwar ungleiche Manualgrößen hat (49, 49 und 37 Tasten), aber dreimanualig ist.
Als Manuale zählen nur Klaviaturen mit den Positionen 1, 2 oder 3; Position 0 bezeichnet das Pedal!
du benutzt in einigen tabellen als PK die bezeichnung NR, hier aber tabellenname_NR. ich würde mich für einen weg entscheiden.
Sicherlich sinnvoll, wird demnächst überarbeitet...
eine relationstabelle gibt es nicht. es ist ein weit vebreiteter irrlgaube, dass mit relation eine beziehung in kontext von datenbanken gemeint ist. in wirklichkeit ist relation ein anderes wort für tabelle, also relation = tabelle.
Na gut, dann "vermittelnde Tabelle"!
nun aber zu deinem eigentlichen problem. du benutzt eine version kleiner als 4.1, das hat einen sehr, sehr grossen nachteil, weil damit dein server keine unterabfragen kann. sicherlch läßt sich für dein problem eine abfrage finden, ABER die möglichkeit unterabfragen zu benutzen wird immer wieder auf dich zukommen. insofern mein tipp an dich, bevor man hier nach einer abfrage sucht, dein projekt auf einen server in version 4.1 oder höher zu benutzen. wenn dies nicht geht (das sollte aber dann schon sehr gute gründe sein),
Serververtrags-Kündigung... Suche nach neuem (und bezahlbarem, was nützt mir mySQL 5.0, wenn entweder der Speicherplatz winzig ist oder ein Vielfaches meines gegenwärtigen all-inkl.com-Servers kostet) Webspace... das kann dauern!
Bis bald im Khyberspace!
Yadgar
yo,
habe im moment wenig zeit, komme also nicht immer dazu sofort zu antworten.
SELECT m.markenname, o.modell
FROM marken m
INNER JOIN orgeln o ON o.marke = m.nr
INNER JOIN orgeln_klaviaturen ok ON ok.orgel-nr
INNER JOIN klaviaturen k ON k.nr = ok.klaviatur-nr
WHERE k.position IN (1,2,3)
GROUP BY m.markenname, o.modell
HAVING COUNT(*) = 2
AND MAX(k.anzahl_tasten) <> MIN(k.anzahl_tasten)
;
Na gut, dann "vermittelnde Tabelle"!
beziehungstabelle klingt sogar noch besser.
Serververtrags-Kündigung... Suche nach neuem (und bezahlbarem, was nützt mir mySQL 5.0, wenn entweder der Speicherplatz winzig ist oder ein Vielfaches meines gegenwärtigen all-inkl.com-Servers kostet) Webspace... das kann dauern!
das argument kann ich noch nicht wirklich nachvollziehen. wenn du das ganze nur privat machst, findet sich für kleines geld mit sicherheit ein besserer server. wenn du es gewerblich machst, dann verstehe ich es noch um so weniger, an der falschen stelle zu sparen.
Ilja