Andreas-Lindig: MySql-Abfragen als Tabelle zwischenspeichern

Hallo Forum,

ich möchte Ergebnismengen aus MySql-Abfragen als Tabelle zwischenspeichern um mit deren Hilfe weitere Abfragen durchzuführen. In Access kann man die Tabelle einfach speichern, in MySql auch?

Danke und Gruß, Andreas

  1. Hallo Forum,

    ich möchte Ergebnismengen aus MySql-Abfragen als Tabelle
    zwischenspeichern um mit deren Hilfe weitere Abfragen
    durchzuführen. In Access kann man die Tabelle einfach
    speichern, in MySql auch?

    Danke und Gruß, Andreas

    Ja, schau mal nach "SELECT ... INTO". Das gibt's übrigens auch bei Access, ist afaik ANSI.

    1. Ja, schau mal nach "SELECT ... INTO".

      INTO?, d.h. ich muß danach einen neuen Tabellennamen nennen oder muß die Tabelle schon vorhanden sein?

      1. Ja, schau mal nach "SELECT ... INTO".
        INTO?, d.h. ich muß danach einen neuen Tabellennamen nennen oder muß die Tabelle schon vorhanden sein?

        wie ich das sehe geht das nicht: http://de.mysql.com/documentation/mysql/bychapter/manual.de_Deutsch.html#ANSI_diff_SELECT_INTO_TABLE

        aber dafür gibt es in MySQL: http://de.mysql.com/documentation/mysql/bychapter/manual.de_Reference.html#INSERT_SELECT
        für beides muß die Tabelle bestehen. Kannst die Tabelle aber auch mit SQL anlegen und löschen: http://de.mysql.com/documentation/mysql/bychapter/manual.de_Reference.html#CREATE_TABLE und http://de.mysql.com/documentation/mysql/bychapter/manual.de_Reference.html#DROP_TABLE

        bei CREATE TABEL gibt es wie Du siehst "TEMORARY", die mußt Du also nicht löschen. Aber die Frage ist ob Du das wirklich brauchst?! Wofür brauchst Du das genau? Meistens geht das auch ohne temporäre Tabellen!

        Grüße
        Andreas

        1. Aber die Frage ist ob Du das wirklich brauchst?! Wofür brauchst Du das genau? Meistens geht das auch ohne temporäre Tabellen!

          wir hatten das Problem vor 2 Tagen schonmal mit der Inkonsistenzabfrage... jaja, man darf Inkonsistenzen nicht einplanen, ok.

          Aber ich habe da ein Beispiel mit dem Fahrradverleih genannt - es ist komplizierter, als ich in Erinnerung hatte:
          es gibt eine Tabelle für die Daten der Räder (Marke, Typ, Anschaffungspreis, id usw.)
          und eine Tabelle 'Ausleihdaten' (Ausleiher, ausleihdatum, rückgabedatum, Rad-id). In dieser Tabelle stehen auch vorbestellte Räder - z.B. 27.9.2002-29.9.2002.

          jetzt kommt jemand und will wissen: "welche Räder sind am 28.9.2002 noch frei?"

          Um das rauszufinden kenne ich nur diese Lösung:
          1.Abfrage - welche Räder sind in dem Nachfragezeitraum vermietet? - Speichern.
          2.Abfrage - zeige alle Räder, die in der Tabelle 'Räder', aber nicht in der temporären Tabelle 'vermietete Räder' stehen.

          mit einer einzigen Abfrage (suche alles, was vor dem Suchzeitraum zurückgegeben wurde/wird und alles, was nach dem Suchzeitraum ausgeliehen wird) bekomme ich immer

          entweder:
          nur alle Räder aus der Verleihtabelle außerhalb des Suchzeitraums (aber nicht diejenigen aus der Räder-Tabelle, die noch nie verliehen wurden)
          oder:
          alle Datensätze (left join), die nicht in dem Suchzeitraum verliehen sind. d.h. aber, daß ich auch Räder gezeigt kriege, die zwar im Suchzeitraum veliehen sind, aber auch schon mal zu anderen Zeiten verliehen waren oder sein werden.

          Ich suche aber nicht Verleihvorgänge, die außerhalb meines Suchzeitraums liegen, sondern freie Räder. Und da kann ich die Inkonsistenz zwischen der temporären Tabelle und der Räder-Tabelle ganz gut nutzen.

          So, hoffe du konntest alles grob verstehen ,-)

          Gruß, Andreas

          1. Aber die Frage ist ob Du das wirklich brauchst?! Wofür brauchst Du das genau? Meistens geht das auch ohne temporäre Tabellen!

            wir hatten das Problem vor 2 Tagen schonmal mit der Inkonsistenzabfrage... jaja, man darf Inkonsistenzen nicht einplanen, ok.

            Aber ich habe da ein Beispiel mit dem Fahrradverleih genannt - es ist komplizierter, als ich in Erinnerung hatte:
            es gibt eine Tabelle für die Daten der Räder (Marke, Typ, Anschaffungspreis, id usw.)
            und eine Tabelle 'Ausleihdaten' (Ausleiher, ausleihdatum, rückgabedatum, Rad-id). In dieser Tabelle stehen auch vorbestellte Räder - z.B. 27.9.2002-29.9.2002.

            jetzt kommt jemand und will wissen: "welche Räder sind am 28.9.2002 noch frei?"

            SELECT  t1.id AS id,
                FORM Räder AS t1
                LEFT JOIN Ausleihdaten AS t2
                    ON t1.id = t2.Rad-id
                WHERE t2.ausleihdatum > $wunschtermin
                    OR t2.rückgabedatum < $wunschtermin
                GROUP BY t1.id;

            Das ist noch nicht ganz fertig, da ich nicht testen kann, und mich nicht gut genug auskenne. So fragst Du nur alle ab, die in der Ausleih-Tabelle stehen, was noch fehlt sind die die noch nicht da drin stehen, aber das geht auch irgendwie, aber das weiß ich jetzt leider nicht so genau, ich weiß aber das es geht. Du müßtest in der Where Bedingung noch die neuen Fahrräder mitnehmen, vielleicht sollte man das mit "HEAVING" kombinieren. Vielleicht hilft schin ein einfaches
            "OR ISNULL t2.ausleihdatum", ich weiß es leider nicht.

            Vielleicht hilft Dur ja: http://www.little-idiot.de/mysql/mysql-117.html

            Grüße
            Andreas

            1. jetzt kommt jemand und will wissen: "welche Räder sind am 28.9.2002 noch frei?"

              SELECT  t1.id AS id,
                  FORM Räder AS t1
                  LEFT JOIN Ausleihdaten AS t2
                      ON t1.id = t2.Rad-id
                  WHERE t2.ausleihdatum > $wunschtermin
                      OR t2.rückgabedatum < $wunschtermin
                  GROUP BY t1.id;

              Das ist noch nicht ganz fertig, da ich nicht testen kann, und mich nicht gut genug auskenne. So fragst Du nur alle ab, die in der Ausleih-Tabelle stehen, was noch fehlt sind die die noch nicht da drin stehen...

              und nicht nur das: wenn Fahrrad xyz vorher verliehen war und zurückgegeben wurde erscheint es auch, obwohl es zum Wunschtermin schon wieder verplant sein kann.
              vielen Dank für Deine Mühe, aber glaub mir: das haben schon mehrere Leute durchgekaut - und sogar unser Master-Brain aus meinem Lehrgang, der wirklich _alles_ konnte (und alles besser als alle Dozenten, abi:1.0 einschließlich Mathe-leistungskurs) ist auf keine andere Lösung gekommen, als die, die ich vorgestellt habe (was zwar nicht heißt daß es die nicht geben kann, aber der Erfahrung mit ihm nach ist es sehr unwahrscheinlich ,-).

              also meine Frage an alle bleibt:
              kann man Abfrageergebnisse als Tabellen zwischenspeichern? und wie? - die Links zu de.mysql.com konnte ich leider noch nicht auswerten, weil ich hier nur begrenzt internet-Zugang habe und zu hause testen muß, dafür habe ich mir das Manual runtergeladen, konnte es aber leider zuhause nicht öffnen...

              tja, für eine einfache Antwort wäre ich dankbar,
              Andreas-Lindig

              1. Hi!

                SELECT  t1.id AS id,
                    FORM Räder AS t1
                    LEFT JOIN Ausleihdaten AS t2
                        ON t1.id = t2.Rad-id
                    WHERE t2.ausleihdatum > $wunschtermin
                        OR t2.rückgabedatum < $wunschtermin
                    GROUP BY t1.id;

                Das ist noch nicht ganz fertig, da ich nicht testen kann, und mich nicht gut genug auskenne. So fragst Du nur alle ab, die in der Ausleih-Tabelle stehen, was noch fehlt sind die die noch nicht da drin stehen...
                und nicht nur das: wenn Fahrrad xyz vorher verliehen war und zurückgegeben wurde erscheint es auch, obwohl es zum Wunschtermin schon wieder verplant sein kann.

                Nein, das nicht, durch group by hast Du nur eine Angabe Pro Rad, und durch die WHERE-bedingung werden bereits alle Datensätze entfernt, die zu dem Zeitpunkt nicht zu Verfügung stehen. Jetzt hast Du alle Räder die schonmal ausgeliehen waren oder für einen anderen zeiptunkt vorgemerkt sind. Was noch feht sind die Räder die noch nie ausgeliehen waren und auch noch nicht vorgemerkt sind. Ich bin 100% isg sicher das  irgendwie geht, mußt ein bisschen mit MAX(), WHERE, GROUP BY und HAVING rumspielen, dazu kenne ich mich aber nicht genug aus ohen das testen zu können. Sonst schick mir mal die Dumps der Tabellen dann probiere ich mal ein wenig!

                vielen Dank für Deine Mühe, aber glaub mir: das haben schon mehrere Leute durchgekaut - und sogar unser Master-Brain aus meinem Lehrgang, der wirklich _alles_ konnte (und alles besser als alle Dozenten, abi:1.0 einschließlich Mathe-leistungskurs)

                hatte ich auch  fast ;-)

                ist auf keine andere Lösung gekommen, als die, die ich vorgestellt habe (was zwar nicht heißt daß es die nicht geben kann, aber der Erfahrung mit ihm nach ist es sehr unwahrscheinlich ,-).

                Ich denk hier im Forum gibt es einige die das wissen, vor allem 2 Damen die darin sehr fähig sind!

                also meine Frage an alle bleibt:
                kann man Abfrageergebnisse als Tabellen zwischenspeichern? und wie? - die Links zu de.mysql.com konnte ich leider noch nicht auswerten, weil ich hier nur begrenzt internet-Zugang habe und zu hause testen muß, dafür habe ich mir das Manual runtergeladen, konnte es aber leider zuhause nicht öffnen...

                1. kann ich das nicht so gut und kurz erklären wie es im Manual steht,
                2. habe ich nicht so viel Zeit. Du wirst Dir doch mal kurz ein paar Links angucken können, das ist wirklichgut erklärt udn zumindest das mit den temporären Tabellen sollte damit geklärt sein!

                Grüße
                Andreas