Selects verschachteln bei MySQL?

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Selects verschachteln bei MySQL?

    Abend Leute,

    wie ich gerade gelesen habe, sind ja Sub-Selects bei MySQL nicht möglich.
    Ist dann wenigstens möglich nach einem max(...) Wert zu selectieren?
    Bsp.
    Select Name,max(versuch) From tabelle1 Where veruch=max(versuch) AND Datum!='0000-00-00' Group Name;

    Es geht mir dabei um das Problem, dass wenn ich nicht diese max(versuch) Bedingung können würde, selectiert der mir mit dem Datum, den vorletzten Versuch, welchen ich ja aber nicht möchte.

    Oder kann ich irgendwie sagen: Selectiere erst alle mit max(versuche) und schaue erst dann bei den erhaltem Ergebnis nach Datum ...???

    Hat damit vielleicht schon jemand Probleme gehabt und eventuell eine Lösung zur Hand?
    Danke
    Tschau
    Max
    Zuletzt geändert von funzel; 22.01.2003, 19:42.

  • #2
    lies die mal diesen thread hier durch.
    http://www.php-resource.de/forum/sho...threadid=15299

    der war ungefähr drei threads unter deinen.
    da wurde das problem sogar sehr nahe deines problems behandelt.
    schaue bei den letzteren posts rein.
    INFO: Erst suchen, dann posten![color=red] | [/color]MANUAL(s): PHP | MySQL | HTML/JS/CSS[color=red] | [/color]NICE: GNOME Do | TESTS: Gästebuch[color=red] | [/color]IM: Jabber.org |


    Kommentar


    • #3
      Hi,

      danke für deine angebotene Hilfe.
      Leider werde ich aus dem anderen Beitrag nicht ganz schlau, und ich denke ich sollte vielleicht mal das ganze Thema erkären.
      Habe zwei Tabellen, eine angebot und die andere angebotsverlauf. Angebot enthält z.B. AnfragenNr(primary key), AngebotsNr, geplanter_Angebotstermin,... Die angebotsverlauf hat: AngebotsNr(primary key), Angebotsversion, Preis,Datum,Ueberarbeitungstermin,...

      Ich möchte nun alle die Daten, die entweder ein geplanten_Angebotsdatum aber kein Datensatz in angebotsverlauf oder ein Angebotsdatum und einen Ueberarbeitungstermin bei der höchsten Angebotsversion in angebotsverlauf haben.

      Dachte mir schon so einige Sachen aus, doch alles funktioniert nicht so richtig, da ich keine SubSelects machen kann :-(
      Hier mein letzter Stand, vielleicht habt ihr ja eine Idee, was ich anders machen sollte.

      SELECT angebot.AngebotsNr, max(angebotsverlauf.Angebotsversion), angebotsverlauf.Ueberarbeitungstermin, angebot.geplanter_Angebotstermin FROM angebot, angebotsverlauf WHERE angebot.AngebotsNr=angebotsverlauf.AngebotsNr AND (angebot.AngebotsNr='' OR angebotsverlauf.Ueberarbeitungstermin!='0000-00-00') AND angebot.geplanter_Angebotstermin!='0000-00-00' GROUP BY angebotsverlauf.AngebotsNr;

      Muss gestehen, dass ich selber langsam den Überblick verliere.
      Werde mir mal jetzt die Version 4.xx von mysql ansehen, vielleicht haben die ja schon SubSelects mit drin.

      Danke für jegliche Meinungen.
      Tschau
      Max

      Kommentar


      • #4
        poste mal die beiden tabellen und wie die verbunden sind.
        ich schaue mal...
        INFO: Erst suchen, dann posten![color=red] | [/color]MANUAL(s): PHP | MySQL | HTML/JS/CSS[color=red] | [/color]NICE: GNOME Do | TESTS: Gästebuch[color=red] | [/color]IM: Jabber.org |


        Kommentar


        • #5
          Abend,

          hier die angebot:
          Code:
          +-------------------------------------+-------------+------+-----+---------+-------+
          | Field                               | Type        | Null | Key | Default | Extra |
          +-------------------------------------+-------------+------+-----+---------+-------+
          | AnfrageNr                           | int(10)     |      | PRI | 0       |       |
          | Uebergabedatum_an_Projektbetreuer   | date        | YES  |     | NULL    |       |
          | AngebotsNr                          | varchar(20) | YES  |     | NULL    |       |
          | gewuenschter_Angebotstermin         | date        | YES  |     | NULL    |       |
          | geplanter_Angebotstermin            | date        | YES  |     | NULL    |       |
          | Grund_fuer_kein_Angebot             | text        | YES  |     | NULL    |       |
          | Uebergabedatum_an_Angebotsabteilung | date        | YES  |     | NULL    |       |
          +-------------------------------------+-------------+------+-----+---------+-------+
          mit der AngebotsNr miteinander verbunden.

          hier die angebotsverlauf:
          Code:
          +-----------------------+-------------+------+-----+------------+-------+
          | Field                 | Type        | Null | Key | Default    | Extra |
          +-----------------------+-------------+------+-----+------------+-------+
          | AngebotsNr            | varchar(20) |      | PRI |            |       |
          | Angebotsversion       | varchar(10) |      | PRI |            |       |
          | Angebotswert          | double      |      |     | 0          |       |
          | Angebotsdatum         | date        |      |     | 0000-00-00 |       |
          | Kundenuebergabe       | date        |      |     | 0000-00-00 |       |
          | Aenderungen           | text        |      |     |            |       |
          | Ueberarbeitungstermin | date        |      |     | 0000-00-00 |       |
          +-----------------------+-------------+------+-----+------------+-------+

          Danke
          TSchau
          Max

          Kommentar


          • #6
            erst einmal ein kleiner tipp. verwende bitte die code tags, wenn du solche tabellen postest.
            das sehen die auch im post so aus, wie du sie kennst....

            hier nun hoffentlich die lösungen .. teste es mal aus.

            .... die entweder ein geplanten_Angebotsdatum aber kein Datensatz in angebotsverlauf
            Code:
            SELECT    *
            FROM      angebot A
                        LEFT OUTER JOIN angebotsverlauf AV USING(AngebotsNr)
            WHERE     geplanter_Angebotstermin IS NOT NULL AND
                      AV.AngebotsNr IS NULL
            .. ein Angebotsdatum und einen Ueberarbeitungstermin bei der höchsten Angebotsversion in angebotsverlauf haben.
            Code:
            SELECT    *
            FROM      angebot A
                        LEFT OUTER JOIN angebotsverlauf AV USING(AngebotsNr)
            WHERE     AV.Angebotsdatum > '0000-00-00' AND
                      AV.Ueberarbeitungstermin > '0000-00-00'
            ORDER BY  AV.AngebotsNr ASC,AV.Angebotsversion DESC
            INFO: Erst suchen, dann posten![color=red] | [/color]MANUAL(s): PHP | MySQL | HTML/JS/CSS[color=red] | [/color]NICE: GNOME Do | TESTS: Gästebuch[color=red] | [/color]IM: Jabber.org |


            Kommentar


            • #7
              Hi,

              danke.
              Die erste Abfrage stimmt ja auch, nur die zweite bringt natürlich wieder nicht die letzte Angebotsversion, sondern die Vorletzte, da es bei ihr sowohl ein Angebotsdatum als auch ein Ueberarbeitungsdatum gibt. Aber diesen Fall will ich ja gar nicht. Ich will nur wenn es bei der letzten Angebotsversion einen solchen Fall gibt.

              Doch mein größtes Problem ist ja, dass die beiden Abfragen kombiniert werden müssen, soll heißen, dass ich mit einer Abfrage alle Daten haben muss, um sie zu sortieren.

              Kennst du dich zufällig mit temporary tables aus? Wie funktioniert das, wenn ich die Abfrage in eine Tabelle schreibe? Aus meinem Handbuch werde ich nicht so richtig schlau. Muss der User immer erst Create... eine Tabelle erstellen und sie am Ende wieder mit Drop löschen? Das wäre ja schon aus reinen Datenbankrechtegründen nicht gewollt.
              Vielleicht kannst du mich ja aufklären.
              Habe in der Mysql 4.0.10 g gelesen, dass SubSelects gehen, doch hast du zufällig ein Doku zur aktuellen Version 3.23? Auf der Homepage habe ich nur die für 4.0.10 gefunden. :-(

              Danke
              TSchau
              Max

              Kommentar


              • #8
                wegen der zweiten sache. da musst du wahrscheinlich noch ein paar sort-felder angeben. dann solltest du das auch hinbekommen.

                beide abfragen kann man leider nicht kombinieren, da unterschiedliche ergebnisse erwartet werden. z.b. muss beim zweiten sortiert werden und ein limit gesetzt. was bei der ersten abfrage nicht darf.

                temp-tables kannst du anlegen und hinterher wieder löschen. das ist ja auch nciht an den benutzer gebunden, der gerade auf der seite surft, sondern an den benutzer, den du bisher schon für die DB verwendet. das sind zwei paar schuhe.

                schaue dir aber zu den temps noch einmal den oben geposteten thread an. da wurde das auch behandelt.

                tipp bennenne die tabelle aber mit einem zufälligem namen. nur so kannst du dann mit mehrern usern gleichzeitig in der DB was machen. jeder hat quasi eine eigen temp-tab. ist auch nötig!
                INFO: Erst suchen, dann posten![color=red] | [/color]MANUAL(s): PHP | MySQL | HTML/JS/CSS[color=red] | [/color]NICE: GNOME Do | TESTS: Gästebuch[color=red] | [/color]IM: Jabber.org |


                Kommentar


                • #9
                  Hi,

                  das mit den Rechten habe ich jetzt in deinen Worten nicht ganz verstanden.
                  Bei mir meldet sich der User an der Datenbank über PHP an , jedoch möchte ich ihm nicht unbedingt create und drop rechte für die Datenbank geben. Und leider wird die beschränkung auf Tabllen nicht funktionieren, da es diese bei der Administration ja noch nicht gibt, sondern erst im Verlauf temporär entstehen.
                  Oder braucht man für temp tables keine create - drop Rechte auf der Datenbank? Waäre schön.

                  Naja, die Kombination der beiden Abfragen würde vielleicht doch gehen, wenn ich Mysql 4.0 mit SubSelect nutze, aber dafür müßten auch nicht nur ein SubSelect funktionieren.
                  Weißt du zufällig wie viele (in die Tiefe gesehen) SubSelects man machen kann? (also: Select ...(select ....(select ...(..))))

                  Danke
                  Tschau
                  Max

                  Kommentar


                  • #10
                    für CREATE und DROP brauchst du logischerweise die rechte in der DB.

                    und es ist auch richtig, dass der user das ist, über den dein php.script sich anmeldet.

                    warum soll er nicht die rechte bekommen. ein angemeldeter website user kann ja eh nicht darauf zugreifen. du müsstest dich schon bei programmieren vertuen, um böse sachen zu machen.

                    wieviele subselect möglich sind, kann ich dir nicht sagen. soviel ich aber gelesen habe, gehen die auch erst ab mysql.ver 4.1.x
                    INFO: Erst suchen, dann posten![color=red] | [/color]MANUAL(s): PHP | MySQL | HTML/JS/CSS[color=red] | [/color]NICE: GNOME Do | TESTS: Gästebuch[color=red] | [/color]IM: Jabber.org |


                    Kommentar


                    • #11
                      Hi,

                      das mit den Rechten ist so eine Sache. Habe mir negativen Situationen zwar noch keine Erfahrung, doch ist es bei mir so, dass es sich nur um eine PHP Inteface im Intranet handelt und sich jeder User mit seier Kennung anmeldet. Wobei ich nicht unbedingt mit der Gefahr leben möchte, dass er die Möglichkeit (absichtich) die Haupttabellen zu löschen.

                      Mit dem SubSelect geht ab der Version 4.0.10g für INSERT ... SELECT oder REPLACE ... SELECT... (was mir ja nicht viel nützt).
                      Doch schreiben sie auch, dass man sonst die Funktion IN() benutzen könnte (Bsp. ... WHERE AnfrageNr IN (SELECT ...)).

                      Tschau

                      Kommentar


                      • #12
                        der internetuser meldet sich an deiner website an. NICHT AN DER DB.

                        ich sage mal, dass das überall so ist. zumindest bei mir ist es so.
                        habe ich kein script, was was löschen darf, kann nix gelöscht werden.
                        INFO: Erst suchen, dann posten![color=red] | [/color]MANUAL(s): PHP | MySQL | HTML/JS/CSS[color=red] | [/color]NICE: GNOME Do | TESTS: Gästebuch[color=red] | [/color]IM: Jabber.org |


                        Kommentar


                        • #13
                          Bei mir ist es so, dass die Daten die der User zur Einwahl auf die PHP Seite nutz auch gleichzeitig die sind mit der er bei der Datenbank angemeldet wird. Da nicht jeder User die gleichen Rechte haben soll und zum zeiten, dass wenn mal jemand an die PHP Dokumente kommt, nicht so automatisch auch an Zugangsdaten für die DB erlangt.

                          Habe es jetzt mal getestet mir den temp tables. Der User an der DB braucht nur CREATE Rechte, die Drop Rechte kann ich weglassen, da sie Tabelle von selber beim schließen der DB wieder gelöscht wird.

                          Ach und man kann pro Connection nur einmal den gleichen Namen für die temp table nutzen, aber jeder Connection könnte auch den gleichen temp table Namen zur gleichen Zeit habe, ohne dass Probleme auftreten (so habe ich das jedenfalls gelesen in meinem HAndbuch).

                          Danke
                          Tschau

                          Kommentar


                          • #14
                            Original geschrieben von funzel
                            Bei mir ist es so, dass die Daten die der User zur Einwahl auf die PHP Seite nutz auch gleichzeitig die sind mit der er bei der Datenbank angemeldet wird. Da nicht jeder User die gleichen Rechte haben soll und zum zeiten, dass wenn mal jemand an die PHP Dokumente kommt, nicht so automatisch auch an Zugangsdaten für die DB erlangt.
                            du willst mir sagen, dass ein user mit seinem login auch automatisch einen DB login hat??

                            so sollte man es schon machen....

                            wenn sich ein user an einer website anmeldet, so wird in tabellen verglichen, ob der user sich anmelden darf.
                            schaue dir mal diesen thread hier an.
                            http://www.php-resource.de/forum/sho...threadid=15290
                            INFO: Erst suchen, dann posten![color=red] | [/color]MANUAL(s): PHP | MySQL | HTML/JS/CSS[color=red] | [/color]NICE: GNOME Do | TESTS: Gästebuch[color=red] | [/color]IM: Jabber.org |


                            Kommentar


                            • #15
                              Mit dem Login wird natürlich nicht gleich auf die Datenbank zugegriffen, doch sind die Daten wie bei deinem Link beschrieben auch bei mir in session gespeichert und dienen so auch später zur DB-Anmeldung.

                              Kommentar

                              Lädt...
                              X