eigentlich ganz einfach, aber ...

  • 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. ***

  • 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. ***

  • 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. ***

  • 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?

  • 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. ***

  • 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!

  • 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

    ...so in der Art?

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


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

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

    ...und darauf die erste Abfage anwenden:

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

Jetzt mitmachen!

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