Yadgar: [MySQL 4.0] Definieren von Variablen in einem Query

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

  1. 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

    1. 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)

      1. 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

        1. 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

          1. 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