Thomas: Result weiter abfragen?

Hallo! Kann ich es anstellen ein Result aus der Datenbank mit einem neuen Query abzufragen?

  1. Hallo! Kann ich es anstellen ein Result aus der Datenbank mit einem neuen Query abzufragen?

    Hallo,

    ja?!! Wenn du die technischen Möglichkeiten dazu hast?!!

    Was willst du eigentlich genau wissen? Wenn du dasselbe Ergebnis nochmal haben willst, schickst du dieselbe Abfrage einfach nochmal an die Datenbank. Ach geht es dir vielleicht um "Paging"?

    Ciao, Frank

    1. Ich weiß jetzt zwar nicht was Paging ist, aber ich möchte die Datenbank abfragen, das Ergebnis als Result speichern und dann die Daten die im Result sind weiter abfragen. Vielleicht weißt du jetzt was ich meine ;-)

      1. Hallo Thomas,

        was hat Dein Posting mit PHP zu tun? Möchtest Du PHP benutzen, um eine Abfrage an ein Datenbankmanagementsystem wie z.B. MySQL, MS SQL-Server, DB2, Oracle, ... abzusetzen und das Ergebnis weiterzuverarbeiten?

        Ich weiß jetzt zwar nicht was Paging ist, aber ich möchte die Datenbank abfragen, das Ergebnis als Result speichern und dann die Daten die im Result sind weiter abfragen.

        Diese Daten könnten noch da sein? Was verstehst Du unter "weiter abfragen"? Das verstehe ich genausowenig wie Frank.

        Möchtest Du Deine Abfrage weiter einschränken?
        Möchtest Du basierend auf den vorliegenden Ergebnissen andere Daten abfragen?

        Das geht ja, aber wie soll man Dir helfen, wenn Du nicht erklären kannst, was Du willst.

        Vielleicht weißt du jetzt was ich meine ;-)

        Nein. Werde konkret. Bringe ein Beispiel.

        Freundliche Grüße

        Vinzenz

        1. was hat Dein Posting mit PHP zu tun? Möchtest Du PHP benutzen, um eine Abfrage an ein Datenbankmanagementsystem wie z.B. MySQL, MS SQL-Server, DB2, Oracle, ... abzusetzen und das Ergebnis weiterzuverarbeiten?

          Ich verwende MySQL

          Ich weiß jetzt zwar nicht was Paging ist, aber ich möchte die Datenbank abfragen, das Ergebnis als Result speichern und dann die Daten die im Result sind weiter abfragen.

          Diese Daten könnten noch da sein? Was verstehst Du unter "weiter abfragen"? Das verstehe ich genausowenig wie Frank.

          Möchtest Du Deine Abfrage weiter einschränken?
          Möchtest Du basierend auf den vorliegenden Ergebnissen andere Daten abfragen?

          Ich habe jetzt zum Beispiel 100 Schüler in der Datenbank die in die 5., 6. und 7. Klasse gehen und Spanisch oder Französisch sprechen.
          Als erstes frage ich ab, welche Schüler in die 5. Klasse gehen und speichere das und dann möchte ich aus diesem Result noch abfragen, welche von den Schülern in der 5. Klasse z.b. Französisch sprechen.

          Naja, würde mich freuen wenn mit jetzt jemand helfen kann ;-)

          Liebe Grüße
          Thomas

          1. Hi,

            na dann fragst du zuerst die Datenbank mit dem Kriterium "Klasse = 5"
            und dann im 2. Schritt noch mal "Klasse = 5 und Französisch = Ja".

            Da brauchst du nichts zwischendurch abspeichern, du erweiterst einfach immer nur deine Abfragebedingung entsprechend. Du beschreibst ja das Ergebnis was du haben möchtest und nicht den Weg dahinzukommen.

              
            SELECT * FROM KlassenTabelle  
            WHERE Klasse = <<dein Parameter>>  
            
            

            Und beim 2. Mal hängst du einfach das Kriterium für die Sprache mit 'ran.

              
            SELECT * FROM KlassenTabelle  
            WHERE Klasse = <<dein Parameter>>  
            AND Französisch = 1  
            
            

            In Unkenntnis deines Datenbankmodells wird man dir da nicht besonders weit weiterhelfen können.

            Ciao, Frank

            1. Hi,

              na dann fragst du zuerst die Datenbank mit dem Kriterium "Klasse = 5"
              und dann im 2. Schritt noch mal "Klasse = 5 und Französisch = Ja".

              Da brauchst du nichts zwischendurch abspeichern, du erweiterst einfach immer nur deine Abfragebedingung entsprechend. Du beschreibst ja das Ergebnis was du haben möchtest und nicht den Weg dahinzukommen.

              SELECT * FROM KlassenTabelle
              WHERE Klasse = <<dein Parameter>>

              
              >   
              > Und beim 2. Mal hängst du einfach das Kriterium für die Sprache mit 'ran.  
              >   
              > ~~~sql
                
              
              > SELECT * FROM KlassenTabelle  
              > WHERE Klasse = <<dein Parameter>>  
              > AND Französisch = 1  
              > 
              
              

              In Unkenntnis deines Datenbankmodells wird man dir da nicht besonders weit weiterhelfen können.

              Ciao, Frank

              Danke aber auf das bin ich auch schon gekommen schließlich ist das nicht sonderlich schwierig... Nur wenn ich es so mache werden das bei meinem Vorhaben ca. 20 Queries die nacheinander ausgeführt werden bei ca. 1200 Schülern... Deshalb habe ich eine Methode gesucht bei der ich die Datenbank nur ein paar Mal abfragen muss und die Ergebnisse mittels PHP weiter abfragen muss.

              Liebe Grüße
              Thomas

              1. Ja, ich (wir) kenne(n) eben nicht die genauen Umstände

                • was du aktuell und wie hast
                • was genau draus werden soll

                Hier gibt es genügend Leute (mich ausgenommen), die dir bei einem PHP/MySQL Unterfangen sehr gut helfen können, wenn du nur konkret genug deine Aufgabenstellung formulieren kannst.

                Also Adé
                Frank

                1. Ja, ich (wir) kenne(n) eben nicht die genauen Umstände

                  • was du aktuell und wie hast
                  • was genau draus werden soll

                  Hier gibt es genügend Leute (mich ausgenommen), die dir bei einem PHP/MySQL Unterfangen sehr gut helfen können, wenn du nur konkret genug deine Aufgabenstellung formulieren kannst.

                  Also Adé
                  Frank

                  Naja ich habs halt jetzt mit lauter einzelnen Queries und Results gemacht. Es funktioniert auch relativ gut, mich hätte es eben nur interessiert, ob es eine Funktion in PHP gibt, die ein Result wie eine Tabelle behandelt und diese zur Abfrage verwendet.

                  Trotzdem Danke
                  Thomas

                  1. Hoi,

                    du könntest ein mehrfach-dimensionales (2-Dim) Array verwenden, PHP kann dies. Etwas schneller als 20 DB-Abfragen sollte es dann schon sein, wobei die Geschwindigkeit bei 20 Queries und 1200 Datensätzen sowie der vermeintlichen gleichzeitigen Nutzer nicht so maßgeblich sein dürfte.

                    Nur ob du dir damit (die Gesamtmenge ins Array zu packen und dann daraus zu selektieren -> Schleifen und if/switch) das Leben einfacher machst ... ?

                    Tom's Vorschlag mit Snapshots in temporären Tabellen ist leider auch nicht ganz bis zu Ende gedacht, aber das konnte er angesichts der mangelhaften Problemschilderung auch nicht besser machen.

                    Du solltest unsere Hinweise auf eine ausführlichere Problembeschreibung für deine Zukunft als Programmierer durchaus beherzigen, denn manchmal hast du die Lösung bereits wenn du das eigentliche Problem nur mal richtig beschreiben kannst. :)

                    Adé
                    Frank

              2. Hallo Thomas,

                In Unkenntnis deines Datenbankmodells wird man dir da nicht besonders weit weiterhelfen können.

                da kann ich Frank nur beipflichten

                Danke aber auf das bin ich auch schon gekommen schließlich ist das nicht sonderlich schwierig...

                Woher sollen wir das wissen? Hast Du uns das erzählt? Nein!

                Nur wenn ich es so mache werden das bei meinem Vorhaben ca. 20 Queries die nacheinander ausgeführt werden bei ca. 1200 Schülern...

                Weder 20 Abfragen noch 1200 Datensätze stellen wirklich ein Problem dar. Sicherlich sind Datenbankabfragen relativ teuer.

                Deshalb habe ich eine Methode gesucht bei der ich die Datenbank nur ein paar Mal abfragen muss und die Ergebnisse mittels PHP weiter abfragen muss.

                Da ich nicht weiß, welche Informationen in Deiner DB stehen und welche Du haben möchtest, kann ich Dir keinen Ratschlag geben, ob Du es besser der Datenbank überlässt, Dir die gewünschten Endresultate zu liefern oder ob es besser ist, die gewünschten Endresultate in der API zu erzeugen.

                Wenn Du es in der API tust, dann kannst Du übrigens auch gern auf die Datenbank verzichten. Ich sehe wenig Sinn darin, auf die großartigen Möglichkeiten eines DBMS zu verzichten, nur weil ich Angst vor dem Absetzen von 20 Queries habe.

                Ich wiederhole noch einmal meine Bitte. Werde konkreter. Zeige Deine Datenbankstruktur, zeige Beispieldatensätze. Sage, welche 20 verschiedenen Ergebnisse Du gerne haben möchtest. Müssen diese 20 Ergebnisse auf einen Schlag vorliegen, benötigst Du diese an verschiedenen Stellen. Alles das hat Einfluss auf eine konkrete Lösung.

                Freundliche Grüße

                Vinzenz

    2. Hello,

      Hallo! Kann ich es anstellen ein Result aus der Datenbank mit einem neuen Query abzufragen?

      Hallo,

      ja?!! Wenn du die technischen Möglichkeiten dazu hast?!!

      Was willst du eigentlich genau wissen? Wenn du dasselbe Ergebnis nochmal haben willst, schickst du dieselbe Abfrage einfach nochmal an die Datenbank. Ach geht es dir vielleicht um "Paging"?

      Dieselbe Abfrage leifert aber nicht unweigerlich dasselbe Ergebnis, schon gar nicht Datenbanken im globalen Netz.

      Wenn Du dasselbe Ergebnis immer wieder zur Verfügung haben willst, musst Du Dir einen "Snapshot" ziehen, das heißt also, die abgefragten Tabellen mit allen ihren veränderlichen Größen als Kopie ablegen. Das kann man verdichtet oder gespreizt tun.

      Ein verdichteter Snapshot ergibt nur genau das eine Ergebnis immer wieder auf genau die eine Abfrage. Man muss noch nicht mal mehr abfragen, da sich ja nichts mehr ändern kann.

      Ein gespreizter Snapshot sichert alle von der Abfrage betroffenen Tabellen und Relationen zum Zeitpunkt der Abfrage und lässt, je nachdem, wie groß die Spreizung angelegt wurde, Varianzen in der Abfrage zu. Aber auch Variationen der Abfrage müssen immer das Abbild zum Zeitpunkt des Snapshots ergeben, sonst wäre es keiner :-)

      Aber das alles wollte der OP sicher nicht wissen.

      Er fragte, wie man sich ein Ergebnis einer Abfrage sichern kann (was mich dann zu dieser Betrachtung geführt hat), um es weiterzuverarbeiten.

      Da gäbe es die Möglichkeit der temporären Tabelle.

      SELECT $fieldlist FROM $tablename INTO TEMPORARY $temptable TYPE=HEAP

      (Syntax ungeprüft)

      Die verschwindet automatisch wieder, wenn die Connection aufgelöst wird.

      Oder es gäbe die Möglichkeit von Subselects

      Und zum Schluss gibt es natüelich noch die Auswertung in der API (also hier mit PHP).

      Harzliche Grüße vom Berg
      http://www.annerschbarrich.de

      Tom

      --
      Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
      Nur selber lernen macht schlau

      1. Aber das alles wollte der OP sicher nicht wissen.

        Er fragte, wie man sich ein Ergebnis einer Abfrage sichern kann (was mich dann zu dieser Betrachtung geführt hat), um es weiterzuverarbeiten.

        Da gäbe es die Möglichkeit der temporären Tabelle.

        SELECT $fieldlist FROM $tablename INTO TEMPORARY $temptable TYPE=HEAP

        (Syntax ungeprüft)

        Die verschwindet automatisch wieder, wenn die Connection aufgelöst wird.

        Oder es gäbe die Möglichkeit von Subselects

        Und zum Schluss gibt es natüelich noch die Auswertung in der API (also hier mit PHP).

        Harzliche Grüße vom Berg
        http://www.annerschbarrich.de

        Tom

        Ja genau soetwas habe ich gemeint. Ich werde mir mal die 3 Möglichkeiten von oben anschauen.

        Vielen Dank
        Thomas

      2. Hello,

        SELECT $fieldlist FROM $tablename INTO TEMPORARY $temptable TYPE=HEAP

        Bei MySQL

        create TEMPORARY Table auswahl Type=Heap select * from mp3files where FILENAME like "Vicky%";

        Funktioniert

        Harzliche Grüße vom Berg
        http://www.annerschbarrich.de

        Tom

        --
        Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
        Nur selber lernen macht schlau

      3. Hi,

        schöner Beitrag für's Archiv mit dem Thema Snapshots. ;)

        Logischerweise kann man nicht für einen Zeitpunkt t+1 garantieren, dass die gleiche Abfrage das gleiche Ergebnis wie zum Zeitpunkt t bringt.

        Aber stell dir mal vor, das möchten gleichzeitig 20 Besucher machen, dann wird 20 Mal eine Verbindungsspezifische temporäre Tabelle angelegt? Ich weiß nicht, wie genau MySQL sowas handhaben tut? 20 temporäre Tabellen parallel oder bei jedem Request wird dieselbe Tabelle wieder neu befüllt (wenn es dieselbe Verbindung ist) ... ist ja dann auch kein Snapshot mehr.

        Aber angesichts der eigentlichen Banalität der Aufgabe (nach dem der OP ein My ausführlicher geworden ist) wäre dieser Ansatz wie mit Kanonen auf Spatzen geschossen.

        Ciao, ciao, ich geh jetzt ne Runde wandern :)
        Frank

        1. Hello,

          Ciao, ciao, ich geh jetzt ne Runde wandern :)
          Frank

          Ich auch

          "Nach Diktat verreist" hieß das früher immer ;-))

          Harzliche Grüße vom Berg
          http://www.annerschbarrich.de

          Tom

          --
          Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
          Nur selber lernen macht schlau

  2. Hello,

    die Sache mit dem TEMPORARY TABLE TYPE=HEAP funktioniert erstklassig.

    Man muss eben nur bedenken, dass man pro Connection nur eine Tabelle unter dem Namen anlegen kann. Wenn man sie ein zweites Mal benutzen will, muss man sie vorher mit DROP TABLE wieder entfernt haben.

    Mittels phpMyAdmin ist das Ganze nicht ausprobierbar, da der für jedes Query eine neue Connection benutzt. Er arbeitet eben verbindungslos.

    Ich verwende daher mit Vorliebe http://www.mysqlfront.de/

    Leider kann ich in der neuen Version bisher die Fehlermeldungen (SQL-Statusmeldungen) nicht finden. Die sind eigentlich immer am lehrreichsten gewesen...

    Harzliche Grüße vom Berg
    http://www.annerschbarrich.de

    Tom

    --
    Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
    Nur selber lernen macht schlau