Erwin: Funktion max() in MySQL

hi,

da hab ich z.b. die folgenden keys in einer Tabelle:

10.2
10.1
10.3

Wie kann ich die Funktion max() verwenden, dass mir am Ende der nächsthöhere mögliche Wert von 10.3 ausgegeben wird? (10.4 muss rauskommen...)

Oder muss ich mir da selber was bauen?

Gruss, Rolf

--
SELFforum - Das Tor zur Welt!
Theoretiker: Wie kommt das Kupfer in die Leitung?
Praktiker: Wie kommt der Strom in die Leitung?
  1. Hallo Rolf

    10.2
    10.1
    10.3

    Feldtyp: Zeichenkette oder Zahl?

    Wie kann ich die Funktion max() verwenden, dass mir am Ende der nächsthöhere mögliche Wert von 10.3 ausgegeben wird? (10.4 muss rauskommen...)

    Wenn Zeichenkette, was ist das Ergebnis von max(), wenn Du z.B. die Werte

    1.1
      2.1
      10.0

    in Deiner Spalte hast. Wie "addierst" Du 0.1 zu einem String

    Oder muss ich mir da selber was bauen?

    Ich denke, das wirst Du wohl tun müssen.
    Abschließende Fragen:
    Warum verwendest Du nicht zwei Spalten mit Integer?
    Denn soweit ich das sehe, haben Vorpunkt- als auch Nachpunktanteil eine eigene Bedeutung?
    Dann gibt es auch keine Probleme mit der Berechnung mehr. Und falls Du einen Index auf Deiner Spalte hast, so kannst Du auch einen kombinierten Index auf die beiden Spalten setzen.

    Freundliche Grüsse,

    Vinzenz

    1. Hallo Vinzenz,

      10.2
      10.1
      10.3

      Feldtyp: Zeichenkette oder Zahl?

      nun, ich hab Zeichenketten... aber die Idee mit 'Zahl' ist gar nicht mal so abwegig !

      Wie kann ich die Funktion max() verwenden, dass mir am Ende der nächsthöhere mögliche Wert von 10.3 ausgegeben wird? (10.4 muss rauskommen...)

      Wenn Zeichenkette, was ist das Ergebnis von max(), wenn Du z.B. die Werte

      1.1
        2.1
        10.0

      in Deiner Spalte hast. Wie "addierst" Du 0.1 zu einem String

      Oder muss ich mir da selber was bauen?

      Ich denke, das wirst Du wohl tun müssen.

      Hmm, nja....

      Abschließende Fragen:
      Warum verwendest Du nicht zwei Spalten mit Integer?
      Denn soweit ich das sehe, haben Vorpunkt- als auch Nachpunktanteil eine eigene Bedeutung?

      Die Index - Tabelle, named 'idx' sieht so aus

      mysql> select * from idx;
      +------+----------------------------------------+
      | idx  | subject                                |
      +------+----------------------------------------+
      | 4    | Perlmodule                             |
      | 6    | Datum und Uhrzeit                      |
      | 7.1  | Datentypen/Listen                      |
      | 7.3  | Datentypen/Hashes                      |
      | 4.2  | Perlmodule/HTML                        |
      | 4.4  | Perlmodule/LWP                         |
      | 11   | Pragmas                                |
      | 12.1 | socket/pop3                            |
      | 12.3 | socket/ftp                             |
      | 4.6  | Perlmodule/Installation                |
      | 10.1 | CGI/Sicherheit                         |
      | 13   | Spider und Suchmaschinen               |
      | 5.1  | Sonstiges/Bugs und  Funktionsverhalten |
      | 1    | Dateien und Verzeichnisse              |
      | 5    | Sonstiges                              |
      | 4.1  | Perlmodule/Image                       |
      | 7    | Datentypen                             |
      | 7.2  | Datentypen/Strings                     |
      | 9    | Netzwerk                               |
      | 10   | CGI                                    |
      | 4.5  | Perlmodule/Text                        |
      | 12   | socket                                 |
      | 12.2 | socket/smtp                            |
      +------+----------------------------------------+
      23 rows in set (0.11 sec)

      ---> es gibt Kategorien und Subkategorien, einmal in 'idx' durch einen Punkt getrennt und in 'subject' mit '/'. Und das alles soll scalierbar sein, d.h., es muss möglich sein, beliebig viele Subkategorien anfügen zu können _ohne_ an der Tabelle was ändern zu müssen.

      Ziel der ganzen Geschichte ist es, die perlbase http://perlbase.xwolf.de an eine RDBMS anzubinden, derzeit halte ich die Daten dort in Berkeley DB's.

      In der Testphase bisher habe ich das Benutzerfrontend komplett fertig, was noch zu tun ist, ist das Frontent zu "Manage Content".

      Sonntagsgruss, Rolf (alias Erwin)

      --
      SELFforum - Das Tor zur Welt!
      Theoretiker: Wie kommt das Kupfer in die Leitung?
      Praktiker: Wie kommt der Strom in die Leitung?
      1. Hallo Rolf

        Die Index - Tabelle, named 'idx' sieht so aus
        +------+----------------------------------------+
        | idx  | subject                                |
        +------+----------------------------------------+
        | 4    | Perlmodule                             |
        | 6    | Datum und Uhrzeit                      |
        | 7.1  | Datentypen/Listen                      |
        | 7.3  | Datentypen/Hashes                      |

        ---> es gibt Kategorien und Subkategorien, einmal in 'idx' durch einen Punkt getrennt und in 'subject' mit '/'. Und das alles soll scalierbar sein, d.h., es muss möglich sein, beliebig viele Subkategorien anfügen zu können _ohne_ an der Tabelle was ändern zu müssen.

        Tabelle

        Kategorien
            kat_id
            subject

        Subkategorien
            kat_id
            sub_id
            subject

        Du hast das Problem, eine Hierarchie mit einem relationalen DBMS darzustellen.
        Prinzipiell wäre dafür ein hierarchisches DBMS besser geeignet, aber die sind schon ein paar Jahrzehnte ausser Mode ;-)

        Du hast zusätzlich Redundanz in Deiner Tabelle:
        idx 7   entspricht 'Datentypen'
        idx 7.1 entspricht 'Datentypen/Listen'
        idx 7.x entspricht 'Datentypen/irgendwas'

        Ich bleibe dabei, deine Vorpunkt- und Nachpunktangaben haben jeweils eigene Bedeutung, Du solltest diese getrennt behandeln.

        Freundliche Grüsse,

        Vinzenz

        1. Moin,

          Tabelle

          Kategorien
              kat_id
              subject

          Subkategorien
              kat_id
              sub_id
              subject

          Das gibts nicht, von einer dritten Tabelle hab ich geträumt heut' nacht ;-)

          Aber: sub_id als ein Feld reicht nicht, zur Identifizierung einer Subkategorie muss es 3 Felder geben, sofern diese rein integer sein sollen:

          kat_id
          sub_layer
          sub_id

          Du hast das Problem, eine Hierarchie mit einem relationalen DBMS darzustellen.

          Wahrscheinlich werde ich an den 2 Tabellen festhalten und wenn's sein muss, meine eigenen Funktionen verwenden die sich anderweitig schon bewährt haben.

          Viele Grüße, Rolf

          --
          SELFforum - Das Tor zur Welt!
          Theoretiker: Wie kommt das Kupfer in die Leitung?
          Praktiker: Wie kommt der Strom in die Leitung?
          1. yo,

            eine hierachie stellt man oft über eine rekursive tabelle da, wobei man rekursionen eigentlich vermeiden sollte. trotzdem wird es oft angewendet.

            id | Verzeichnisname | sortierung | übergeordnete_verzechnis_id

            dann brauchst du nur eine tabelle und die tabellenstruktur ist unabhängig davon, wieviele unterverzecihnisse du hast. root verzecihnisee besitzen eben kein übergeordnetets_verzeichnis_id, dessen spalteninhalte sind also NULL und lassen sich somit leicht abfragen. über die spalte sortierung kannst die themen der gleichen ebene beliebig sortieren. aber nicht vergessen, rekursionen sind mit vorsicht zu verwenden.

            Ilja

            1. Hi,

              eine hierachie stellt man oft über eine rekursive tabelle da, wobei man rekursionen eigentlich vermeiden sollte. trotzdem wird es oft angewendet.

              id | Verzeichnisname | sortierung | übergeordnete_verzechnis_id

              dann brauchst du nur eine tabelle und die tabellenstruktur ist unabhängig davon, wieviele unterverzecihnisse du hast. root verzecihnisee besitzen eben kein übergeordnetets_verzeichnis_id, dessen spalteninhalte sind also NULL und lassen sich somit leicht abfragen. über die spalte sortierung kannst die themen der gleichen ebene beliebig sortieren. aber nicht vergessen, rekursionen sind mit vorsicht zu verwenden.

              Jow, die Idee mit rekursiven Tabs ist auch gut. Aber so wie's aussieht werde ich an der bisherigen DB struktur festhalten

              idx
              idx subject

              content
              idx id jubject body ... author indate outdate ...

              Den Content aus solch einer DB rauszuholen, übersichtlich zu browsen, mit Volltextsuche - das geht einwandfrei.

              Ein bischen "Geficke" gibts mit dem "Manage-Content" beim Ermitteln der nächsthöheren idx.idx weil string Variablen like 10.1.1.1 - aber das hab ich auch schon soweit fertig.

              Es ist ja auch keine Schande, denke ich, mal eben eine vielleicht 100 oder 500 zeilige 2-spaltige Tabelle komplett auf einen hash zu lesen, zumal das Management-Script sowieso nur von Wenigen und auch nich sooft wie das öffentliche Frontend aufgerufen wird.

              Und Inhaltsverzeichnisse, bzw, Hierarchie's für Dokumentenablagen mit mehr als 500 Zeilen sind eh fragwürdig bzw. eines reDesigns wert. Heißt: evntl. Gedanken zu einer übergeordneten Kategorie, sog. Bereiche...

              Später Gruss,
              Rolf-Erwin

              --
              SELFforum - Das Tor zur Welt!
              Theoretiker: Wie kommt das Kupfer in die Leitung?
              Praktiker: Wie kommt der Strom in die Leitung?
  2. yo,

    Wie kann ich die Funktion max() verwenden, dass mir am Ende der nächsthöhere mögliche Wert von 10.3 ausgegeben wird? (10.4 muss rauskommen...)

    nicht max, sondern min()

    SELECT min(spalte) FROM tabelle WHERE spalte > 10.3

    Ilja

  3. Wie kann ich die Funktion max() verwenden, dass mir am Ende der nächsthöhere mögliche Wert von 10.3 ausgegeben wird? (10.4 muss rauskommen...)

    garnicht, den der sql server kann nicht hellsehen.

    max liefert den größten der vorhandenen werte.
    den nächsthöherer möglichen Wert mußt du dann schon selbst ermitteln.