Martin2004: Was mach ich da falsch?

Hallo und guten Tag,

hab da ein Problem. Ich hab folgenden Code:

?php
                                                mysql_select_db('usr_web123_2');
         $sql = "SELECT
 name
             FROM de_entries
 WHERE max(name)
         group by category = 'Poesie'"; // alles anzeigen
//echo $sql;

$return = mysql_query($sql) or print(mysql_error());
 $_data = mysql_fetch_assoc($return);
   echo $_data['name'];
   ?>

Damit will ich eingetlich in meiner Tabellen in der MySQL Datenbank eine Abfrage mache. Also ich hab ein Forum da möche ich jetzt z.B. in der Tabelle de_entries die Spalte name den letzten Namen auslesen, also immer der höchsten. Versteht Ihr was ich meine?

Gruß Martin

  1. Hallo,

    wenn ich dich richtig verstanden hab, würde ich es so machen:
    Ich lese die Tabelle aus mit einem ORDER BY name DESC und lese dann nur die rerste zeile aus. dann hast du den "höchsten" wert.

  2. Hallo!
    Mit max(name) bekommst Du nicht den letzten Namen sondern den "höchsten", also den alphabetisch letzten (Zzzzz).
    Des weiteren: Wo liegt genau Dein Problem??
    Gruß
    Florian

    1. Hallo Florian,

      ich hab folgendes Problem,

      ich hab ein Forum jetzt habe ich da eine Übersichtsseite geamcht. Dort möchte ich jetzt gerne von den einzelnen Rubriken immer den letzten Namen auslesen lassen der einen Beitrag in der jeweiligen Rubrik geschrieben hat.

      Die Tablle heißt: de_entries die Spalte wo die Rubriken drin sind heißen: category und der Namen der User die was schreiben werden in der Spalte name gespeichert.

      So ich hoffe dass ich jetzt alles ausfühlrich geschrieben habe....

      Gruß Martin2004

      1. Hallo!
        Einfach wäre es, wenn Du jedem Eintrag eine ID geben würdest. Dann liest Du die höchste ID aus jeder Rubrik mit allen Attributen aus.
        max(ID)

        1. Hi Florian,

          Einfach wäre es, wenn Du jedem Eintrag eine ID geben würdest. Dann liest Du die höchste ID aus jeder Rubrik mit allen Attributen aus.
          max(ID)

          es hat jeder eintrag eine ID (kenne das Forum, das von Alex).

          @Martin: Dir hilft WHERE id = max(id)

          MfG, Dennis.

          --
          Mein SelfCode: ie:{ fl:{ br:^ va:) ls:< fo:) rl:( n4:& ss:) de:> js:( ch:{ sh:( mo:} zu:|
          Zufällige Hinweise:
          ------------------------
          Interessiert in Modellbahn?
          Wie wärs mit http://www.go-modellbahn.de?
          1. Hi Dennis,

            ja aber ich will doch nicht die ID haben ich brauch doch einen Namen und nicht die ID oder?

            Gruß Martin

            1. Hi Martin2004,

              ja aber ich will doch nicht die ID haben ich brauch doch einen Namen und nicht die ID oder?

              ja, aber erst musst du mit max() die höchste ID (oder Timestamp) herrausfinden, und dann kannst du den Eintrag mit der herrausgefundenen ID auslesen (mit Namen usw.).

              MfG, Dennis.

              --
              Mein SelfCode: ie:{ fl:{ br:^ va:) ls:< fo:) rl:( n4:& ss:) de:> js:( ch:{ sh:( mo:} zu:|
              Zufällige Hinweise:
              ------------------------
              [remote-signature:http://riehle-web-modellbahn.s4.cybton.com/selfforum/signatur.php]
  3. yo,

    SELECT name FROM de_entries WHERE max(name) group by category= 'Poesie'

    diese abfrage ist syntaktisch falsch. deshalb ist es immer ratsam über die funktion mysql_error() sich den fehler ausgeben zu lassen, falls eine query fehl schlägt.

    Also ich hab ein Forum da möche ich jetzt z.B. in der Tabelle de_entries die Spalte name den letzten Namen auslesen, also immer der höchsten. Versteht Ihr was ich meine?

    ja und nein, die abfrage dazu solte nicht schwer sein. die frage ist, was genau "letzten namen" bei dir bedeutet, letzter im alphabet oder letzter bezüglich eines vorhandenen datums, etc. aber versuch einfach mal folgendes.

    SELECT max(name)
    FROM de_entries
    WHERE category = 'Poesie'

    Ilja

    1. Hallo Ilja,

      hab das jetzt mal so gemacht:

      <?php
                                                      mysql_select_db('usr_web123_2');
                $sql = "SELECT max(name)
                FROM de_entries
                WHERE category = 'Poesie'";
      $return = mysql_query($sql) or print(mysql_error());
      $_data = mysql_fetch_assoc($return);
      echo $_sql['name'];
      ?>

      jetzt kommt zwar keine Felhermeldung mehr aber es kommt jetzt gar nichts mehr. Also die Spalte bleibt leer :-(

      Gruß Martin

      1. yo,

        jetzt kommt zwar keine Felhermeldung mehr aber es kommt jetzt gar nichts mehr. Also die Spalte bleibt leer :-(

        das liegt daran, dass du keine datensätze hast, die in der spalte category den wert 'Poesie' haben. mein vorschlag war mehr eine versuch ins blaue zu schießen. wenn ich dich aber richtig verstanden habe, willst du den namen jeder kategorie, der am letzten einen beitrag geschrieben hat. und dazu brauchst du eine spalte mit einem datumswert.

        Ilja

        1. Hallo Ilja

          das liegt daran, dass du keine datensätze hast, die in der spalte category den wert 'Poesie' haben. mein vorschlag war mehr eine versuch ins blaue zu schießen. wenn ich dich aber richtig verstanden habe, willst du den namen jeder kategorie, der am letzten einen beitrag geschrieben hat. und dazu brauchst du eine spalte mit einem datumswert.

          Jepp genau du hast es richtig verstanden. Aber ich komme gerade nicht dahinter wie ich das dann machen muss. Und doch in der category ist der Wert Poesie drin das habe ich selber gerade was geschrieben :-) Ab er leider spuckt er nicht aus...

          Gruß Martin

          1. yo,

            Jepp genau du hast es richtig verstanden. Aber ich komme gerade nicht dahinter wie ich das dann machen muss. Und doch in der category ist der Wert Poesie drin das habe ich selber gerade was geschrieben :-) Ab er leider spuckt er nicht aus...

            nun spucken soll er ja auch nicht. wie auch immer, du musst über das datum gehen, insofern kümmer dich einfach nicht um die alte abfrage. sag doch noch mal dein aufbau deiner tabellen bitte.

            Ilja

            1. Hallo Ilja,

              nun spucken soll er ja auch nicht. wie auch immer, du musst über das datum gehen, insofern kümmer dich einfach nicht um die alte abfrage. sag doch noch mal dein aufbau deiner tabellen bitte.

              Hmm nee Spucken soll er wirklich nicht aber er sollte mit was ausgeben das wurde mir schon reichen. Wie meine Tabelle in der Datenbank aussieht das habe ich gerade geschrieben das sieht du unter Nachtrag. Da habe ich das mal rein kopiert.

              Gruß Martin

        2. Nachtrag:

          So sieht meine Tabelle in der SQM Datenbank aus:

          CREATE TABLE de\_entries (
            id int(11) NOT NULL auto_increment,
            pid int(11) NOT NULL default '0',
            tid int(11) NOT NULL default '0',
            uniqid tinytext NOT NULL,
            time timestamp(14) NOT NULL,
            last\_answer timestamp(14) NOT NULL,
            edited timestamp(14) NOT NULL,
            edited\_by tinytext NOT NULL,
            user\_id int(11) default '0',
            name tinytext NOT NULL,
            subject tinytext NOT NULL,
            category tinytext NOT NULL,
            email tinytext NOT NULL,
            hp tinytext NOT NULL,
            place tinytext NOT NULL,
            ip tinytext NOT NULL,
            text text NOT NULL,
            show\_signature tinyint(4) default '0',
            email\_notify tinyint(4) default '0',
            marked tinyint(4) default '0',
            locked tinyint(4) default '0',
            fixed tinyint(4) default '0',
            views int(11) default '0',
            PRIMARY KEY  (id),
            UNIQUE KEY ID (id),
            KEY tid (tid),
            KEY category (category(10))
          ) TYPE=MyISAM AUTO_INCREMENT=82 ;

          1. yo,

            So sieht meine Tabelle in der SQM Datenbank aus:

            ohne dir einen schrecken einjagen zu wollen. aber vielleicht solltest du bevor du die query machst erst einmnal über dein tabellen-design nachdenken. auf den ersten blick (gefühl) würde ich sagen, da ist noch genug raum für verbesserungen. ;-)

            hast du schon mal normalisiert ?

            Ilja

            1. Hallo Ilja,

              sorry aber jetzt verstehe ich wirklich nicht was du meinst. Das ist doch eine ganz Normale Tabelle oder? Ich habe hier noch mehr aber ich kann ja nicht alle 11 Tabellen hier rein kopieren oder willst du mal alles sehen ?

              Gruß Martin

              1. yo,

                SELECT max(name)
                FROM de_entries
                GROUP BY category
                HAVING time = max(time);

                ich gehe mal davon aus, dass time die spalte ist, die das entsprechende datum enthält. ansonsten einfach den den spaltennamen austauschen. die abfrage sollte dir hoffentlich von alle kategorien den max(name) geben. willst du nur von einer bestimmten kategorie, füge die WHERE klausel mit der entsprechenden kategorie hinzu.

                Ilja

                1. Hallo Ilja,

                  Sorry das geht auch nicht :-( Ich glaube das wird nichts mehr.

                  Gruß Martin

                  1. yo,

                    Sorry das geht auch nicht :-( Ich glaube das wird nichts mehr.

                    was genau geht den nicht, syntax oder semantischer fehler und welcher ?

                    Ilja

                2. Hi Ilja,

                  SELECT max(name)
                  FROM de_entries
                  GROUP BY category
                  HAVING time = max(time);

                  Ähm, ich würds mal so probieren:

                  SELECT name
                  FROM de_entries
                  WHERE time = max(time)

                  Alternativ sollte wohl auch WHERE id = max(id) funktionieren.

                  MfG, Dennis.

                  --
                  Mein SelfCode: ie:{ fl:{ br:^ va:) ls:< fo:) rl:( n4:& ss:) de:> js:( ch:{ sh:( mo:} zu:|
                  Zufällige Hinweise:
                  ------------------------
                  Bedeutung meines SelfCodes
                  1. yo,

                    Ähm, ich würds mal so probieren:

                    SELECT name
                    FROM de_entries
                    WHERE time = max(time)

                    meines wissens sind aggregat funktionen innerhalb der WHERE klausel nicht zulässig. insofern sollte diese abfrage einen syntaxfehler erzeugen.

                    Alternativ sollte wohl auch WHERE id = max(id) funktionieren.

                    ud über die ID würde ich auch nicht gehen, da dies ein indirekter weg ist, der auch leicht in die irre führen kann.

                    Ilja

                    1. Hi Ilja,

                      SELECT name
                      FROM de_entries
                      WHERE time = max(time)

                      meines wissens sind aggregat funktionen innerhalb der WHERE klausel nicht zulässig. insofern sollte diese abfrage einen syntaxfehler erzeugen.

                      Habs nicht ausprobiert, meinte mehr sowas:

                      SELECT
                        name,
                        MAX(time) AS lastone
                      FROM
                        de_entries
                      WHERE
                        time = lastone

                      so müsste es eigentlich gehen.

                      Alternativ sollte wohl auch WHERE id = max(id) funktionieren.

                      ud über die ID würde ich auch nicht gehen, da dies ein indirekter weg ist, der auch leicht in die irre führen kann.

                      Hm, eigentlich nicht, da die Spalte id auto_increment ist und der letzte Eintrag nun mal immer die höchste ID hat.

                      MfG, Dennis.

                      --
                      Mein SelfCode: ie:{ fl:{ br:^ va:) ls:< fo:) rl:( n4:& ss:) de:> js:( ch:{ sh:( mo:} zu:|
                      Zufällige Hinweise:
                      ------------------------
                      [remote-signature:http://riehle-web-modellbahn.s4.cybton.com/selfforum/signatur.php]
                      1. yo,

                        Habs nicht ausprobiert, meinte mehr sowas:

                        SELECT
                          name,
                          MAX(time) AS lastone
                        FROM
                          de_entries
                        WHERE
                          time = lastone

                        das geht auch nicht. mal von mysql abgesehen wird auch das einen syntaxfehler erzeugen.

                        Hm, eigentlich nicht, da die Spalte id auto_increment ist und der letzte Eintrag nun mal immer die höchste ID hat.

                        zum einen stimmt das nicht zwangsweise und ist somit schon eine mögliche fehlerquelle. zum anderen muss dass nicht auf den timestamp zutreffen.

                        Ilja

                        1. Hallo Ilja,

                          wenn ich das so vom Dennis mache:

                          <?php                                          mysql_select_db('usr_web123_2');
                          $sql = "SELECT name,
                          MAX(time) AS lastone
                          FROM        de_entries
                          WHERE
                          time = lastone";
                          $return = mysql_query($sql) or print(mysql_error());
                          // $_sql = mysql_fetch_assoc($return);
                          echo $_sql['name'];
                          ?>

                          Da kommt jetzt dann folgende Meldung:

                          Unknown column 'lastone' in 'where clause'

                          Gruß Martin

                          1. Hi Martin2004,

                            Unknown column 'lastone' in 'where clause'

                            jupp, da hab ich mich wohl vertan. Vermutlich kommst du hier nicht drum rum mit einem Sub-Select zu arbeiten (verschachtele Selects), lies dir dazu vielleicht auch mal http://dev.mysql.com/doc/mysql/de/ANSI_diff_Sub-selects.html durch.

                            MfG, Dennis.

                            --
                            Mein SelfCode: ie:{ fl:{ br:^ va:) ls:< fo:) rl:( n4:& ss:) de:> js:( ch:{ sh:( mo:} zu:|
                            Zufällige Hinweise:
                            ------------------------
                            [remote-signature:http://riehle-web-modellbahn.s4.cybton.com/selfforum/signatur.php]
                          2. yo,

                            versuch doch noch mal auf meine nachfrage weiter unten einzugehen, warum mein vorschlag nicht geht, sprich fehlermeldung oder inhaltlicher fehler. es ist immer schwer zu helfen, wenn man die tabellen nicht selbst vor augen hat und ausprobieren kann.

                            Ilja