1. Dashboard
  2. Forum
    1. Unerledigte Themen
  3. Mitglieder
    1. Letzte Aktivitäten
    2. Benutzer online
    3. Team-Mitglieder
    4. Trophäen
    5. Mitgliedersuche
  4. Tutorial Bereich
  • Anmelden
  • Registrieren
  • Suche
Dieses Thema
  • Alles
  • Dieses Thema
  • Dieses Forum
  • Seiten
  • Forum
  • Lexikon
  • Erweiterte Suche
  1. Informatik Forum
  2. Webmaster & Internet
  3. Entwicklung

eigentlich ganz einfach, aber ...

  • maciek
  • 5. Februar 2005 um 23:52
  • Unerledigt
  • maciek
    16
    maciek
    Mitglied
    Punkte
    2.805
    Beiträge
    434
    • 5. Februar 2005 um 23:52
    • #1

    Eigentlich wäre das ja ganz einfach, aber mit MySQL (3.23 = ohne Subqueries) kriege ich das nicht hin. Jetzt wollte ich fragen, ob das an mir liegt, oder ob man das mit dieser MySQL-Version wirklich nicht hinkriegt:

    Die Tabellen Struktur schaut folgendermaßen aus:
    klasse -> string
    untere grenze -> integer

    Die obere Grenze jeder Klasse ergibt sich nun aus der unteren Grenze der nächsthöheren Klasse - 1. Also in etwa:

    SELECT klasse, uGrenze, ("nächste untere Grenze" - 1) AS oGrenze
    FROM klassen
    ORDER BY uGrenze;

    Kann man das SQL-konform ohne Subqueries formulieren?

    Thanx 4 help.

    *** Make it idiot proof, and someone will build a better idiot. ***

  • rck
    15
    rck
    Mitglied
    Reaktionen
    2
    Punkte
    2.342
    Beiträge
    437
    • 6. Februar 2005 um 00:19
    • #2
    Zitat von maciek

    Kann man das SQL-konform ohne Subqueries formulieren?

    Sind die Abstände äquidistant?

    [ egapemoh eniem ] [ Korneuburg Community ] [ FB ] [ Xng ]

  • maciek
    16
    maciek
    Mitglied
    Punkte
    2.805
    Beiträge
    434
    • 6. Februar 2005 um 00:24
    • #3
    Zitat von rck

    Sind die Abstände äquidistant?


    nope. Die können beliebig sein ...

    *** Make it idiot proof, and someone will build a better idiot. ***

  • rck
    15
    rck
    Mitglied
    Reaktionen
    2
    Punkte
    2.342
    Beiträge
    437
    • 6. Februar 2005 um 00:38
    • #4

    wart mal. Dein SQL ist ja überhaupt russisch. Wonach gruppierst Du? where sehe ich auch keines?!

    Wenn Du mir 10 Beispieldatensätze gibst, kann ich ein bisserl damit herumspielen.

    [ egapemoh eniem ] [ Korneuburg Community ] [ FB ] [ Xng ]

  • maciek
    16
    maciek
    Mitglied
    Punkte
    2.805
    Beiträge
    434
    • 6. Februar 2005 um 00:46
    • #5
    Zitat von rck

    wart mal. Dein SQL ist ja überhaupt russisch. Wonach gruppierst Du? where sehe ich auch keines?!

    Wenn Du mir 10 Beispieldatensätze gibst, kann ich ein bisserl damit herumspielen.


    naja ... 10 sind vielleicht ein bissi viel. 5 sollten reichen, oder?

    uGrenze -> klasse
    0 -> public
    1 -> user
    33 -> power-user
    67 -> admin
    99 -> superadmin
    100 -> nobody

    Die Abstände sind deswegen sinnvoll, weil man ja im Nachhinein vielleicht auf die Idee kommen könnte noch "Zwischenklassen" einzuführen.

    *** Make it idiot proof, and someone will build a better idiot. ***

  • rck
    15
    rck
    Mitglied
    Reaktionen
    2
    Punkte
    2.342
    Beiträge
    437
    • 6. Februar 2005 um 00:55
    • #6
    Zitat von maciek

    Die Abstände sind deswegen sinnvoll, weil man ja im Nachhinein vielleicht auf die Idee kommen könnte noch "Zwischenklassen" einzuführen.

    Verstehe. Du willst also ermitteln, welchen Titel eine bestimmte Anzahl von Postings ergibt. Oder bekommt jeder Benutzer genau einen Wert, entsprechend der Tabelle?

    [ egapemoh eniem ] [ Korneuburg Community ] [ FB ] [ Xng ]

  • rck
    15
    rck
    Mitglied
    Reaktionen
    2
    Punkte
    2.342
    Beiträge
    437
    • 6. Februar 2005 um 00:56
    • #7

    Wart, nein das gibt auch keinen Sinn. 100 ist nobody. Sprich: Jeder bekommt genau einen dieser Werte und basta. Oder?

    Wenn ja: Mach einfach ein GROUP BY Berechtigungsstufe oder sowas. Das müsste reichen.

    EDIT: am besten, wir besprechen das in meinem Chat. Ich check die Aufgabenstellung noch nicht ganz.

    [ egapemoh eniem ] [ Korneuburg Community ] [ FB ] [ Xng ]

  • maciek
    16
    maciek
    Mitglied
    Punkte
    2.805
    Beiträge
    434
    • 6. Februar 2005 um 11:46
    • #8

    ok ... also nochmal langsam:

    1) Das Problem ist mehr ein theoretisches (bissi konstruiertes). Ich möcht einfach nur wissen, ob es möglich ist, oder nicht. Die obere Grenze der Klasse kann ich mir ja auch mittels PHP ausrechnen (was ich derzeit auch tue).
    2) Ich hab Klassen von Zugriffsrechten. Jede Klasse hat einen Namen und eine untere Grenze (als numerischen Wert). Die obere Grenze ergibt sich demnach aus der unteren Grenze der nächst-höheren Klassen - 1.
    3) Die User bekommen bestimmte Zahlenwerte zugewiesen und je nachdem wie ihr Wert ausschaut fallen Sie in eine bestimmte Klasse.

    Ich möchte z.B. eine Tabelle machen, wo drinnen steht, d.h. so viel wie (wenn ich die oberen Klassen hernehme):

    Name | uGrenze | oGrenze
    ------------------------------
    public | 0 | 0
    user | 1 | 32
    power-user| 33| 66
    admin | 67| 98
    superadmin| 99| 99
    nobody | 100| 1000 (z.B.)

    Geht das nun mit einer Query (ohne Subqueries) oder muss man das wirklich mittels PHP im Nachhinein ausrechnen. Inwiefern ein GROUP BY da helfen soll, weiss ich nicht so ganz, aber vielleicht tut es das ja wirklich ...

    *** Make it idiot proof, and someone will build a better idiot. ***

  • creature
    6
    creature
    Mitglied
    Reaktionen
    1
    Punkte
    371
    Beiträge
    60
    • 6. Februar 2005 um 13:01
    • #9

    Also ich könnte mir so einen Lösungsweg vorstellen. Das ergebnis wird zwar auch in PHP zusammengeführt, aber es muss nichts dort berechnet werden.

    Mach zuerst eine Abfrage mit:

    SELECT * FROM klassen ORDER BY uGrenze;

    Das ganze in $result_1 ablegen.

    Dann die Abfrage:

    SELECT (uGrenze - 1) FROM klassen ORDER BY uGrenze LIMIT 1, +INF;
    Das ganze in $result_2 ablegen.

    Dann eine ganz einfache Schleife, mit der du jede Zeile aus $result_1 in ein Array ausgibst. In der Schleife auch das Ergebnis von $result_2 in ein Array und dann so ausgeben:

    echo $row_1[0].$row_1[1].$row_2[0];

    Natürlich muss noch ne Abfrage rein rein, ob mysql_fetch_array($result_2) true liefert, da ja der einen Abfrage 1 Tupel fehlt.


    Das Ganze mit einer einzigen Abfrage laufen zu lassen ohne Subqueries halte ich für unmöglich, da du dich ja entweder auf ein folgendes oder ein vorhergehendes Tupel beziehen musst (je nachdem wie's geordnet sein soll).

    Hocus - Pocus, Stop this insanity!

  • rck
    15
    rck
    Mitglied
    Reaktionen
    2
    Punkte
    2.342
    Beiträge
    437
    • 6. Februar 2005 um 19:37
    • #10
    Zitat von maciek

    Inwiefern ein GROUP BY da helfen soll, weiss ich nicht so ganz, aber vielleicht tut es das ja wirklich ...

    Gut, kenn mich aus. Ich war schon wieder einen Schritt weiter und wollte diese Klassen mit tatsächlichen Usern mergen.

    Wir haben also eine schlichte Tabelle:

    Code
    create table klassen (name text, grenze int);

    tun dort Deine Daten rein...

    Code
    mysql> insert into klassen values ("public", 0), ("user", 1), ("power-user", 33), ("admin", 67), ("superadmin", 99), ("nobody", 100);
    Query OK, 6 rows affected (0.00 sec)
    Records: 6  Duplicates: 0  Warnings: 0

    ...und kriegen die gewünschte Tabelle raus

    Code
    mysql> select a.name, a.grenze uGrenze, min(b.grenze)-1 oGrenze
        -> from klassen a, klassen b
        -> where b.grenze>a.grenze
        -> group by a.name, a.grenze
        -> order by uGrenze;
    +------------+---------+---------+
    | name       | uGrenze | oGrenze |
    +------------+---------+---------+
    | public     |       0 |       0 |
    | user       |       1 |      32 |
    | power-user |      33 |      66 |
    | admin      |      67 |      98 |
    | superadmin |      99 |      99 |
    +------------+---------+---------+
    5 rows in set (0.02 sec)
    Alles anzeigen

    ...so in der Art?

    den nobody kannst Du mit union nachrüsten, jedoch weis ich da leider nicht wie ich alles sortiere:

    Code
    mysql> select a.name, a.grenze uGrenze, min(b.grenze)-1 oGrenze
        -> from klassen a, klassen b
        -> where b.grenze>a.grenze group by a.name, a.grenze
        -> union select "nobody", 100, 1000;
    +------------+---------+---------+
    | name       | uGrenze | oGrenze |
    +------------+---------+---------+
    | admin      |      67 |      98 |
    | power-user |      33 |      66 |
    | public     |       0 |       0 |
    | superadmin |      99 |      99 |
    | user       |       1 |      32 |
    | nobody     |     100 |    1000 |
    +------------+---------+---------+
    6 rows in set (0.01 sec)
    Alles anzeigen


    alternativ kannst Du einen "höchsten Wert" vorgeben:

    Code
    insert into klassen value ("highvalue", 1000);

    ...und darauf die erste Abfage anwenden:

    Code
    mysql> select a.name, a.grenze uGrenze, min(b.grenze)-1 oGrenze
        -> from klassen a, klassen b
        -> where b.grenze>a.grenze
        -> group by a.name, a.grenze
        -> order by uGrenze;
    +------------+---------+---------+
    | name       | uGrenze | oGrenze |
    +------------+---------+---------+
    | public     |       0 |       0 |
    | user       |       1 |      32 |
    | power-user |      33 |      66 |
    | admin      |      67 |      98 |
    | superadmin |      99 |      99 |
    | nobody     |     100 |    1000 |
    +------------+---------+---------+
    6 rows in set (0.01 sec)
    
    
    mysql>
    Alles anzeigen

    Das group by brauchst du, damit Du die Aggregatsfunktion "min" verwenden kannst. Alles klar?

    [ egapemoh eniem ] [ Korneuburg Community ] [ FB ] [ Xng ]

  • Maximilian Rupp 27. Dezember 2024 um 12:06

    Hat das Thema aus dem Forum Programmieren nach Entwicklung verschoben.

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!

Benutzerkonto erstellen Anmelden

Benutzer online in diesem Thema

  • 1 Besucher

Rechtliches

Impressum

Datenschutzerklärung