Ralf: SQL-Abfrage mit PHP

Hi,

ich möchte in einer Tabelle einen Datensatz einfügen. Ein Feld dieses Datensatzes stellt die user_nr dar, welche in einer anderen Tabelle steht:

Tabelle1:
user_id, time,...

Tabelle2:
id, user_id, name,...

Es soll also in Tabelle2 ein Datensatz eingefügt werden, wobei in user_id die nummer stehen soll, bei der in Tabelle1 time=$wert ist.

Ich hoffe das war verständlich von mir ausgedrückt :)

Wie sieht hierfür der SQL-String aus.

Danke und Gruss

Ralf

  1. Hi Ralf,

    probier es mal mit

    SELECT Tabelle2.*, Tabelle1.time
    FROM Tabelle1 INNER JOIN Tabelle2 ON Tabelle1.user_id = Tabelle2.user_id
    WHERE (((Tabelle1.time)="123"))

    Müsste eigentlich laufen, ich habe sie mit Access generiert, müsste aber auch in PHP laufen. wie die SQL-Statements in PHP ausgeführt werden und die Daten nachher ausgelesen werden, weisst du, oder. Ansonsten melde dich

    CU
    Martin

    Hi,

    ich möchte in einer Tabelle einen Datensatz einfügen. Ein Feld dieses Datensatzes stellt die user_nr dar, welche in einer anderen Tabelle steht:

    Tabelle1:
    user_id, time,...

    Tabelle2:
    id, user_id, name,...

    Es soll also in Tabelle2 ein Datensatz eingefügt werden, wobei in user_id die nummer stehen soll, bei der in Tabelle1 time=$wert ist.

    Ich hoffe das war verständlich von mir ausgedrückt :)

    Wie sieht hierfür der SQL-String aus.

    Danke und Gruss

    Ralf

    1. Hi,

      SELECT Tabelle2.*, Tabelle1.time
      FROM Tabelle1 INNER JOIN Tabelle2 ON Tabelle1.user_id = Tabelle2.user_id
      WHERE (((Tabelle1.time)="123"))

      Müsste eigentlich laufen, ich habe sie mit Access generiert, müsste aber auch in PHP laufen. wie die SQL-Statements in PHP ausgeführt werden und die Daten nachher ausgelesen werden, weisst

      du, oder. Ansonsten melde dich

      Danke für Deine schnelle Hilfe, aber ich will ja in Tabelle2 schreiben. Müsste es dann nicht ein INSERT Befehl sein?

      Gruss

      Ralf

      1. Schreib mal, welche Werte du in die Tabelle2 schreiben willst. Du brauchst die Tabelle1 dann gar nicht.

        Hi,

        SELECT Tabelle2.*, Tabelle1.time
        FROM Tabelle1 INNER JOIN Tabelle2 ON Tabelle1.user_id = Tabelle2.user_id
        WHERE (((Tabelle1.time)="123"))

        Müsste eigentlich laufen, ich habe sie mit Access generiert, müsste aber auch in PHP laufen. wie die SQL-Statements in PHP ausgeführt werden und die Daten nachher ausgelesen werden, weisst
        du, oder. Ansonsten melde dich

        Danke für Deine schnelle Hilfe, aber ich will ja in Tabelle2 schreiben. Müsste es dann nicht ein INSERT Befehl sein?

        Gruss

        Ralf

  2. Halihallo

    Tabelle1:
    user_id, time,...

    Tabelle2:
    id, user_id, name,...

    Es soll also in Tabelle2 ein Datensatz eingefügt werden, wobei in user_id die nummer stehen soll, bei der in Tabelle1 time=$wert ist.

    Da brauchst du zwei Queries:

    SELECT user_id AS "1" from Tabelle1 WHERE time="$wert"

    und dann

    INSERT INTO Tabelle2 SET user_id="what-you've-got-from-select", ...

    das geht leider net in einem...  (OK, Subselects, aber die werden nicht von jeder DB unterstützt, eg. mysql nicht)

    Viele Grüsse

    Philipp

    1. Halihallo

      gleichfalls ;-)

      Tabelle1:
      user_id, time,...

      Tabelle2:
      id, user_id, name,...

      Es soll also in Tabelle2 ein Datensatz eingefügt werden, wobei in user_id die nummer stehen soll, bei der in Tabelle1 time=$wert ist.

      Da brauchst du zwei Queries:

      ja?

      SELECT user_id AS "1" from Tabelle1 WHERE time="$wert"

      und dann

      INSERT INTO Tabelle2 SET user_id="what-you've-got-from-select", ...

      tse,tse, und sowas von Dir...

      das geht leider net in einem...  (OK, Subselects, aber die werden nicht von jeder DB unterstützt, eg. mysql nicht)

      meinst Du sowas: http://de.mysql.com/documentation/mysql/bychapter/manual.de_Reference.html#INSERT_SELECT ?

      Also das Beispiel da:
      INSERT INTO temporaere_tabelle2 (fldID) SELECT temporaere_tabelle1.fldOrder_ID FROM temporaere_tabelle1 WHERE
      temporaere_tabelle1.fldOrder_ID > 100;

      Das müßte man doch ummünzen können, oder unterliege ich hier einem folgenschweren Irrtum?

      Steht sogar hier: http://de.mysql.com/documentation/mysql/bychapter/manual.de_Reference.html#HANDLER, wobei ich gestehen muß das ich es selbst noch nie verwendet habe und nicht 100%ig sicher bin das es nicht erst ab V4 funktioniert, aber zu 99,99% bin ich sicher das es auch in älteren Versionen funktioniert.

      Viele Grüße
      Andreas

      1. Hallo Andreas,

        ich denke Du hättest recht, wenn er nur eine Spalte einfügen würde, aber da sein Datensatz ja mehr enthält und mindesten noch die Schlüsselspalte bedient werden muß, kommst Du um 2 Statements nicht herum. Diese Aussage betrifft deinen ersten Lösungsvorschlag. Da ich mich mit MySQL nicht sonderlich gut auskenne kann ich zum 2. Vorschlag aus dem Stegreif nichts sagen.

        Gruß Frank

        1. Halihallo Frank

          ich denke Du hättest recht, wenn er nur eine Spalte einfügen würde, aber da sein Datensatz ja mehr enthält und mindesten noch die Schlüsselspalte bedient werden muß, kommst Du um 2 Statements nicht herum. Diese Aussage betrifft deinen ersten Lösungsvorschlag. Da ich mich mit MySQL nicht sonderlich gut auskenne kann ich zum 2. Vorschlag aus dem Stegreif nichts sagen.

          SELECT Tabelle1 (user_id, hello_world) SELECT Tabelle2.user_id, 'value' AS 'hello_world' FROM Tabelle2 WHERE time="$time"

          ??? - Vielleicht funktioniert's ja. Aber ich bin mir ziemlich sicher, dass wenn's für ein Feld geht, auch für beliebig viele funktioniert. Und falls es dann wirklich nicht anders geht, braucht man vielleicht doch zwei Queries ;)

          Viele Grüsse

          Philipp

          1. Hallo!

            ich denke Du hättest recht, wenn er nur eine Spalte einfügen würde, aber da sein Datensatz ja mehr enthält und mindesten noch die Schlüsselspalte bedient werden muß, kommst Du um 2 Statements nicht herum.

            Folgendes steht un der Doku:

            INSERT [LOW_PRIORITY] [IGNORE] [INTO] tabelle [(spalten_liste)] SELECT ...

            Wenn da steht `spalten_liste´ gehe ich jetzt einfach mal davon aus das man einfach im Select entsprechend mehrere Spalten auswählen kann, oder?

            Diese Aussage betrifft deinen ersten Lösungsvorschlag. Da ich mich mit MySQL nicht sonderlich gut auskenne kann ich zum 2. Vorschlag aus dem Stegreif nichts sagen.

            SELECT Tabelle1 (user_id, hello_world) SELECT Tabelle2.user_id, 'value' AS 'hello_world' FROM Tabelle2 WHERE time="$time"

            ??? - Vielleicht funktioniert's ja.

            http://www.mysql.com/doc/en/ANSI_diff_Sub-selects.html

            Aber ich bin mir ziemlich sicher, dass wenn's für ein Feld geht, auch für beliebig viele funktioniert. Und falls es dann wirklich nicht anders geht, braucht man vielleicht doch zwei Queries ;)

            bist Du vielleicht noch ein wenig müde?

            Viele Grüße
            Andreas

            PS: ein wenig Erholung wird doch auch mir mal vergönnt sein, oder ;-)

            1. Halihallo Andreas

              Folgendes steht un der Doku:

              INSERT [LOW_PRIORITY] [IGNORE] [INTO] tabelle [(spalten_liste)] SELECT ...

              Wenn da steht `spalten_liste´ gehe ich jetzt einfach mal davon aus das man einfach im Select entsprechend mehrere Spalten auswählen kann, oder?

              Jep und sogar ganze Strings einfach mitübergeben ;)

              ??? - Vielleicht funktioniert's ja.
              http://www.mysql.com/doc/en/ANSI_diff_Sub-selects.html

              THX ;)

              Aber ich bin mir ziemlich sicher, dass wenn's für ein Feld geht, auch für beliebig viele funktioniert. Und falls es dann wirklich nicht anders geht, braucht man vielleicht doch zwei Queries ;)

              bist Du vielleicht noch ein wenig müde?

              Nene, hab's schon verstanden; hast aber trotzdem recht, ich bin immer müde.

              PS: ein wenig Erholung wird doch auch mir mal vergönnt sein, oder ;-)

              aber, aber, 'türlich! 'türlich! ;-)

              Viele Grüsse

              Philipp

              1. Hi Philipp!

                Folgendes steht un der Doku:

                INSERT [LOW_PRIORITY] [IGNORE] [INTO] tabelle [(spalten_liste)] SELECT ...

                Wenn da steht `spalten_liste´ gehe ich jetzt einfach mal davon aus das man einfach im Select entsprechend mehrere Spalten auswählen kann, oder?

                Jep und sogar ganze Strings einfach mitübergeben ;)

                Was für strings? Wem willst Du was übergeben?

                Grüße
                Andreas

                1. Halihallo Andreas

                  Wenn da steht `spalten_liste´ gehe ich jetzt einfach mal davon aus das man einfach im Select entsprechend mehrere Spalten auswählen kann, oder?

                  Jep und sogar ganze Strings einfach mitübergeben ;)

                  Was für strings? Wem willst Du was übergeben?

                  z. B. ein Adressbucheintragung zu einem Kunden:

                  INSERT INTO Address (user_id, name, vorname) SELECT user_id, '$name', '$vorname' FROM User WHERE time="$time"

                  oder so... Also Formulardaten über Strings in das SELECT-Statement einfügen und so in das INSERT-Statement übergeben.

                  Approppos müde: Bezogst du das darauf, dass ich zwei SELECT-Statements verknüpfte, was wohl nicht im Sinne der Aufgabenstellung war? - Ja, da war ich wohl etwas müde, war nämlich schrott, was ich da schrieb ;)

                  Viele Grüsse

                  Philipp

                  1. Hallo!

                    Jep und sogar ganze Strings einfach mitübergeben ;)

                    Was für strings? Wem willst Du was übergeben?

                    z. B. ein Adressbucheintragung zu einem Kunden:

                    INSERT INTO Address (user_id, name, vorname) SELECT user_id, '$name', '$vorname' FROM User WHERE time="$time"

                    hm. wo liegt da der tiefere Sinn? Hat Deine Tabelle User  verschiedene/variable  Namen/Vornamen Spalten?

                    oder so... Also Formulardaten über Strings in das SELECT-Statement einfügen und so in das INSERT-Statement übergeben.

                    OK, in der WHERE Bedingung, aber das was Du da machst verstehe ich nicht!

                    Approppos müde: Bezogst du das darauf, dass ich zwei SELECT-Statements verknüpfte, was wohl nicht im Sinne der Aufgabenstellung war? - Ja, da war ich wohl etwas müde, war nämlich schrott, was ich da schrieb ;)

                    war eher so allgemein gemeint, da Du sonst viel mehr als ich über mysql weißt ;-)

                    Grüße
                    Andreas

                    1. Halihallo Andreas

                      INSERT INTO Address (user_id, name, vorname) SELECT user_id, '$name', '$vorname' FROM User WHERE time="$time"

                      hm. wo liegt da der tiefere Sinn? Hat Deine Tabelle User  verschiedene/variable  Namen/Vornamen Spalten?

                      Meine Tabelle??? - Ich bezog mich auf die Aufgabenstellung... Mag sein, dass diese Tabelle auch vom Fragesteller mehrere Spalten hat, deshalb hab ich das so geschrieben...

                      oder so... Also Formulardaten über Strings in das SELECT-Statement einfügen und so in das INSERT-Statement übergeben.
                      OK, in der WHERE Bedingung, aber das was Du da machst verstehe ich nicht!

                      Nun, ich dachte mir nur, dass es vielleicht zu Problemen führt (eg. nicht unterstützt oder so), wenn man dem INSERT-Statement einen SELECT übergibt + Normale Daten, also etwa so:

                      INSERT INTO T (u,v) SELECT u FROM Other_Table, 'blabla'

                      Da dachte ich mir, warum nicht "normale Felder" in die SELECT Abfrage packen, dass der Insert nur den SELECT übergeben bekommt? - Somit hat mein keinen "durchmischten" INSERT, sondern einen reinen INSERT mit SELECT. Dann stellte sich die Frage, wie kann man "normale" Daten in einen SQL-SELECT stecken... Naja, dann war eben

                      INSERT INTO T (u,v) SELECT u, '$formular_daten' AS v FROM Other_Table

                      entstanden... War nur so ne kleine Überlegung, nicht sonderlich von relevanz, basierte lediglich darauf, dass ich mit dem Ding keine Erfahrung habe und somit nicht genau weiss, wie sich das so verhält...

                      Approppos müde: Bezogst du das darauf, dass ich zwei SELECT-Statements verknüpfte, was wohl nicht im Sinne der Aufgabenstellung war? - Ja, da war ich wohl etwas müde, war nämlich schrott, was ich da schrieb ;)

                      war eher so allgemein gemeint, da Du sonst viel mehr als ich über mysql weißt ;-)

                      Na, ich glaube da liegst du falsch ;-)
                      Du hast ja in diesem Thread bewiesen, dass du die Funktionsmöglichkeiten von mysql ziemlich gut kennst, bzw. dich schon mal durch die Doku gelesen hast (zumindest zu diesem Thema).
                      Ich möchte hier mal was ganz allgemeines klarstellen:

                      Ich bin _kein_ Fachmann; ich kann eigentlich gar nix wirklich. Klar, ich kenne die Grundlagen von einigen Systemen (u. a. Perl, mysql, ...), aber ich bin darin eigentlich gar nicht gut. Ich meine, ich _weiss_ eigentlich gar nicht viel darüber. Ich habe nur das Grundlagewissen; der Grund, warum ich auch mit diesem sehr weit gekommen bin (meine subjektive Meinung!), ist einzig und allein eine Eigenschaft: Kreativität und vielleicht sogar ein Sinn für schöne Lösungen ;-)
                      Das sehe ich als meine Stärke, nicht das Wissen, sondern der "Erfindergeist". Ein kleines Beispiel vielleicht: Vor einiger Zeit hatten wir ja den Thread bezüglich der Performance von Webspace. Michael und nacher auch du haben mir aufgezeigt, dass es viel besser wäre, über das Log des Apachen zu fahren... Der Grund, warum ich diese Idee nicht hatte, war schlicht der, dass ich den Apachen nicht kenne, also eben kein Fachmann bin und mich mit den Systemen gar nicht gut auskenne. Aber ich habe auch mit diesem "beschränkten" Wissen eine Lösung gefunden und das habe ich bisher für fast alle meine Probleme (programmiertechnischer Natur *g*)... Ich bin eigentlich auch ganz froh über das. Denn wenn ich alles Systeminternas kennen würde, müsste ich nicht so Kreativ sein (das log des Apachen auszulesen ist wohl kaum so "kompliziert", wie das ganze Logging selber zu schreiben und performanceoptimierend zu programmieren). Ich bin einfach ein Mensch, der lieber alles selber programmiert, als auf bestehende Systeme zurückzugreifen. Das ist meine Motivation und wahrscheinlich auch erst der Grund, warum ich jetzt hier in diesem Forum bin. Wenn ich diese Eigenschaft nicht gehabt hätte, wär ich jetzt wohl im Studium und würde mich mit Komplexitätsanalyse, Kombinatorik etc. herumschlagen...
                      Um den Kreis zu schliessen: Ich glaube sogar, dass du wesentlich mehr verstehst, als ich. Ich lerne eigentlich nur, wenn ich mit dem bisherigen Wissen nicht weiterkomme. Eigentlich bin ich ein fauler Mensch, aber genau diese Faulheit macht mich Stark *gg*...

                      Naja, soviel mal kurz zu meiner Person ;-)

                      Viele Grüsse

                      Philipp

      2. Halihallo
        gleichfalls ;-)

        Prost! ;)

        Da brauchst du zwei Queries:
        ja?

        Öm. Dachte ich zumindest... ;)
        Geht auf jeden Fall am einfachsten so ;)
           <-- der jetzt grad auf der Suche nach einer guten Ausrede ist ;)

        SELECT user_id AS "1" from Tabelle1 WHERE time="$wert"

        und dann

        INSERT INTO Tabelle2 SET user_id="what-you've-got-from-select", ...

        tse,tse, und sowas von Dir...

        ARGHHH! NEIIIN! scnr

        das geht leider net in einem...  (OK, Subselects, aber die werden nicht von jeder DB unterstützt, eg. mysql nicht)

        meinst Du sowas: http://de.mysql.com/documentation/mysql/bychapter/manual.de_Reference.html#INSERT_SELECT ?

        Öm. So in der Art ja, nur wusste ich nicht, dass bereits sowas in mysql preimplementiert ist... Naja, in mysql 3.23.xx sind ja Subqueries im _allgemeinen_ noch nicht implementiert. Aber anscheinend haben dir bereits sowas im "kleinen Stile" implementiert... Wusste ich nicht.

        Also das Beispiel da:
        INSERT INTO temporaere_tabelle2 (fldID) SELECT temporaere_tabelle1.fldOrder_ID FROM temporaere_tabelle1 WHERE
        temporaere_tabelle1.fldOrder_ID > 100;

        Das müßte man doch ummünzen können, oder unterliege ich hier einem folgenschweren Irrtum?

        sich kurz an das eigentliche Problem zurückerinnernd... Ja, sollte funktionieren ;)

        INSERT INTO Tabelle1 (user_id) SELECT Tabelle2.user_id WHERE time="$time";

        wenn ich noch der Analogie mächtig bin...

        Steht sogar hier: http://de.mysql.com/documentation/mysql/bychapter/manual.de_Reference.html#HANDLER, wobei ich gestehen muß das ich es selbst noch nie verwendet habe und nicht 100%ig sicher bin das es nicht erst ab V4 funktioniert, aber zu 99,99% bin ich sicher das es auch in älteren Versionen funktioniert.

        Naja, gut, ist aber auch etwas mit "Bedacht" zu verwenden. Wie gesagt, das ganze ist ziemlich low-level und greift "direkt" auf die Tabelle zu. Eg. bei komplizierten Transaktionen könnten da unvorhergesehene Fehler und Inkonsistenzen entstehen...
          <-- der gerade das erste mal von HANDLERN gehört hat und sich vielleicht einmal durch die ganze mysql-Doku durchlesen sollte ;)

        Viele Grüsse

        Philipp
           <-- der jetzt kleinbei gegeben hat und den weisen Andreas verehrt ;-))
           <-- der sich fragt, wie es dir geht und schon lange nix mehr von dir gehört hat...