Mark: Select String in MySQL DB

Hallo,

ich habe ein kleineres Problem mit einem Select in einer MySQL DB.

Meine Tabelle sieht ca. so aus:

id|datum|wert
1|100|lala1
2|101|lala2
3|102|lala3
4|103|lala4
5|104|lala5
6|105|lala6

Nun möchte ich von den drei neusten (datum = max) Einträgen einen per Zufall auswählen. Sprich, per Zufall id 4, 5 oder 6 auswählen.

Bisher sieht das bei mir so aus (der Teil "WHERE (bedingung LIKE 'irgendEtwas')" ist nur der Vollständigkeit halber...):
SELECT wert FROM tabelle WHERE (bedingung LIKE 'irgendEtwas') ORDER BY rand(NOW()) LIMIT 1"

Mir fehlt also eigentlich "nur" das er nicht aus allen sondern den neusten drei Einträgen auswählt... Nur wie mach ich das? ORDER BY Datum bringt mich auch nicht weiter...

Besten Dank schon einmal!

  • Mark
  1. Hallo,

    ich habe ein kleineres Problem mit einem Select in einer MySQL DB.

    welche Version?

    Meine Tabelle sieht ca. so aus:

    id|datum|wert
    1|100|lala1
    2|101|lala2
    3|102|lala3
    4|103|lala4
    5|104|lala5
    6|105|lala6

    naja, Datumswerte sehen anders aus :-)

    Nun möchte ich von den drei neusten (datum = max) Einträgen einen per Zufall auswählen. Sprich, per Zufall id 4, 5 oder 6 auswählen.

    Bisher sieht das bei mir so aus (der Teil "WHERE (bedingung LIKE 'irgendEtwas')" ist nur der Vollständigkeit halber...):
    SELECT wert FROM tabelle WHERE (bedingung LIKE 'irgendEtwas') ORDER BY rand(NOW()) LIMIT 1"

    Mir fehlt also eigentlich "nur" das er nicht aus allen sondern den neusten drei Einträgen auswählt... Nur wie mach ich das? ORDER BY Datum bringt mich auch nicht weiter...

    Ein Subselect sollte Dir helfen, MySQL 4.1 ist die Voraussetzung.

    Freundliche Grüße

    Vinzenz

    1. Hallo,

      ich habe ein kleineres Problem mit einem Select in einer MySQL DB.

      welche Version?

      Meine Tabelle sieht ca. so aus:

      id|datum|wert
      1|100|lala1
      2|101|lala2
      3|102|lala3
      4|103|lala4
      5|104|lala5
      6|105|lala6

      naja, Datumswerte sehen anders aus :-)

      Nun möchte ich von den drei neusten (datum = max) Einträgen einen per Zufall auswählen. Sprich, per Zufall id 4, 5 oder 6 auswählen.

      Bisher sieht das bei mir so aus (der Teil "WHERE (bedingung LIKE 'irgendEtwas')" ist nur der Vollständigkeit halber...):
      SELECT wert FROM tabelle WHERE (bedingung LIKE 'irgendEtwas') ORDER BY rand(NOW()) LIMIT 1"

      Mir fehlt also eigentlich "nur" das er nicht aus allen sondern den neusten drei Einträgen auswählt... Nur wie mach ich das? ORDER BY Datum bringt mich auch nicht weiter...

      Ein Subselect sollte Dir helfen, MySQL 4.1 ist die Voraussetzung.

      Freundliche Grüße

      Vinzenz

      MySQL 5.x
      Und ja, Datum sieht anders aus. Dann nennen wir es halt einfach i. Ist nur Symbolisch gemeint um mein Problem zu erklären...

      Wie baue ich denn so Subselects auf?

      1. Hallo Mark,

        bitte kein TOFU und auch kein TUFO ;-)

        id|datum|wert
        1|100|lala1
        2|101|lala2
        3|102|lala3
        4|103|lala4
        5|104|lala5
        6|105|lala6

        SELECT wert FROM tabelle WHERE (bedingung LIKE 'irgendEtwas') ORDER BY rand(NOW()) LIMIT 1"

        Mir fehlt also eigentlich "nur" das er nicht aus allen sondern den neusten drei Einträgen auswählt... Nur wie mach ich das? ORDER BY Datum bringt mich auch nicht weiter...

        Ein Subselect sollte Dir helfen, MySQL 4.1 ist die Voraussetzung.
        MySQL 5.x

        Wie baue ich denn so Subselects auf?

        so wie es im Handbuchkapitel Subquery-Syntax steht.

        Du möchtest:

        Gib mir einen
            zufälligen Datensatz
        aus
            den drei Datensätzen,
            die das neueste Datum aufweisen

        Freundliche Grüße

        Vinzenz

        1. Besten Dank für den Link.
          Ich habe mir eine Select-Abfrage zusammengebaut komm aber nicht weiter:

          SELECT * FROM tbl1
            WHERE id = ANY

          (SELECT id FROM tbl1
            WHERE (autor LIKE '0') ORDER BY position DESC LIMIT 0,3)

          ORDER BY rand(NOW()) LIMIT 1

          Ich denke das dies mein gewünschtes Ziel erreicht, doch blöderweise bekomme ich diese Meldung:
          "#1235 - This version of MySQL doesn't yet support 'LIMIT & IN/ALL/ANY/SOME subquery'"

          Gibt es noch eine andere Möglichkeit das ganze mit einem Query abzufragen?

          Guss

          • Mark
          1. Hallo Mark,

            Ich habe mir eine Select-Abfrage zusammengebaut komm aber nicht weiter:

            SELECT * FROM tbl1
              WHERE id = ANY
            (SELECT id FROM tbl1
              WHERE (autor LIKE '0') ORDER BY position DESC LIMIT 0,3)

            ORDER BY rand(NOW()) LIMIT 1

            ergibt erwartungsgemäß die von Dir angeführte Fehlermeldung. Du kannst LIMIT nicht dazu nutzen ein IN bzw. ANY-Konstrukt mit Daten zu füllen.

            Gibt es noch eine andere Möglichkeit das ganze mit einem Query abzufragen?

            Dir ist ja klar, dass

              
            SELECT  
                <spaltenliste>  
            FROM  
                <tabelle>  
            ORDER BY  
                position DESC  
            LIMIT 3  
            
            

            die drei Datensätze liefert, aus denen Du einen zufällig auswählen willst. Du kannst dieses ganz simpel umsetzen, indem Du Deinen Datensatz genau aus dieser Ergebnismenge wählst:

              
            SELECT                   -- Gib mir  
               a.spalte1,            -- die gewünschten  
               ...  
               a.spalteN             -- Spalten  
            FROM (                   -- aus dem Abfrageergebnis von  
                SELECT                   -- Gib mir  
                    <spaltenliste>       -- die gewünschten Spalten  
                FROM                     -- aus  
                    <tabelle>            -- meiner Tabelle  
                ORDER BY                 -- nach  
                    position DESC        -- Position absteigend sortiert,  
                LIMIT 3                  -- beschränkt auf die ersten drei Datensätze  
            ) a                      -- das über den Namen a angesprochen wird  
            ORDER BY                 -- sortiert nach  
                RAND()               -- Zufall  
            LIMIT 1                  -- begrenzt auf einen Datensatz  
            
            

            Sowas nennt man übrigens auch einen temporären View.

            Freundliche Grüße

            Vinzenz

            1. Besten Dank! So hat es geklappt...

              • Mark