Ankündigung

Einklappen
Keine Ankündigung bisher.

case als select?

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • case als select?

    Hallo liebe Leute,
    ich bin wieder einmal auf der Suche nach einer Lösung.
    Ich habe eine Tabelle mit Startnummern,
    Code:
     CREATETABLE`snr` (
    `id`int(11) NOTNULL,
    `no`int(3) NOTNULL COMMENT 'start_nummer',
    `anz`int(3) NOTNULL COMMENT 'anzahl startnummern'
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
    In dieser sind Nummern von 1- 500 enthalten und die sind in verschiedener Anzahl vorhanden.
    Nun möchte ich gerne aus anderen Tabellen eine Abfrage generieren, die feststellt welche die letzte vergebene Nummer ist, bzw. ggf. die erste eines jeden Vorgangs. Soweit sogut, das ist auch kein Problem.
    Nun mein Gedanke:
    Ich möchte mit einem CASE die Datenbank gleich eine No vergeben lassen die in der Abfrage der vorhandenen No in der Anzahl nicht Null ist . Mein Lösungsanstaz funktioniert leider nicht.
    Code:
    SELECT
            MIN(`anmeldung`.`Startnummer`) AS `first` ,
            MAX(`anmeldung`.`Startnummer`) AS `last`,
            `rennen_unter`.`first_snr`, `rennen_unter`.`last_snr`,
            `rennen_unter`.`comp_name`,
            CASE
                WHEN `first` < `last`
                THEN (
                        SELECT `snr`.`no`
                        FROM `snr`
                        WHERE `snr`.`no` >`last`
                        AND `snr`.`anz` >0
                        ORDER BY `snr`.`no` ASC
                        LIMIT 1)
            ELSE (
                        SELECT `snr`.`no`
                        FROM `snr`
                        WHERE `snr`.`no` >`first`
                        AND `snr`.`anz` >0
                        ORDER BY `snr`.`no` ASC
                        LIMIT 1)
    END
            FROM `anmeldung`
            JOIN `rennen_unter` ON `rennen_unter`.`id` = `anmeldung`.`comp_number`
            WHERE `anmeldung`.`comp_number` = 18

  • #2
    Lösung ist :
    Code:
    SELECT
            MIN(`anmeldung`.`Startnummer`) AS `first` ,
            MAX(`anmeldung`.`Startnummer`) AS `last`,
            `rennen_unter`.`first_snr`, `rennen_unter`.`last_snr`,
            `rennen_unter`.`comp_name`,
            CASE
                WHEN MIN(`anmeldung`.`Startnummer`) < MAX(`anmeldung`.`Startnummer`)
                THEN (
                        SELECT `snr`.`no`
                        FROM `snr`
                        WHERE `snr`.`no` >MAX(`anmeldung`.`Startnummer`)
                        AND `snr`.`anz` >0
                        ORDER BY `snr`.`no` ASC
                        LIMIT 1)
            ELSE ( SELECT `snr`.`no`
                        FROM `snr`
                        WHERE `snr`.`no` >MIN(`anmeldung`.`Startnummer`)
                        AND `snr`.`anz` >0
                        ORDER BY `snr`.`no` ASC
                        LIMIT 1)
                        END AS `nextNo`
            FROM `anmeldung`
            JOIN `rennen_unter` ON `rennen_unter`.`id` = `anmeldung`.`comp_number`
            WHERE `anmeldung`.`comp_number` = 18

    Kommentar


    • #3
      Das ist syntaktisch falsch. Kann sein, daß alte Versionen von MySQL das nicht erkennen und ein zufälliges Resultat liefern.
      PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

      Kommentar


      • #4
        Zitat von akretschmer Beitrag anzeigen
        Das ist syntaktisch falsch. Kann sein, daß alte Versionen von MySQL das nicht erkennen und ein zufälliges Resultat liefern.
        Danke, was wäre richtig?

        Kommentar


        • #5
          wenn Du aggregierst (min, max, ...) müssen alle Spalten im Result entweder aggregiert oder gruppiert sein.
          PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

          Kommentar


          • #6
            Zitat von akretschmer Beitrag anzeigen
            wenn Du aggregierst (min, max, ...) müssen alle Spalten im Result entweder aggregiert oder gruppiert sein.
            Da muss ich passen. Da reicht mein Wissen nicht um dir zu folgen.

            Kommentar


            • #7
              Code:
              test=*# create table demo (a int, b int, c int);
              CREATE TABLE
              test=*# select max(a), b, c from demo;
              FEHLER:  Spalte »demo.b« muss in der GROUP-BY-Klausel erscheinen oder in einer Aggregatfunktion verwendet werden
              ZEILE 1: select max(a), b, c from demo;
                                      ^
              test=*# create table demo (a int, b int, c int);
              CREATE TABLE
              test=*# select max(a), b, c from demo;
              FEHLER:  Spalte »demo.b« muss in der GROUP-BY-Klausel erscheinen oder in einer Aggregatfunktion verwendet werden
              ZEILE 1: select max(a), b, c from demo;
                                      ^
              test=*# select max(a), b, c from demo group by b, c;
               max | b | c
              -----+---+---
              (0 Zeilen)
              
              test=*#
              PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

              Kommentar


              • #8
                Danke dir, vorweg einmal, die Datenbanken sind auf dem aktuellsten Stand und auch die Abfrage läuft auf beiden. das technische GROUP BY war mir schon klar, doch der Sinn ist mir nicht klar. Einfach nur zu gruppieren ist leicht aber warum? Wenn ich nur nach mache, bleibt der Lerneffekt weg.

                Kommentar


                • #9
                  machen wir es mal ganz einfach:

                  Code:
                  test=*# drop table demo;
                  DROP TABLE
                  test=*# create table demo (a int, b int);
                  CREATE TABLE
                  test=*# insert into demo values (2,5);
                  INSERT 0 1
                  test=*# insert into demo values (4,8);
                  INSERT 0 1
                  test=*# select avg(a), b from demo;
                  avg(a) erwartest Du sicherlich nun 3, oder? Aber was soll es für b anzeigen? 5? Ist der Durchschnitt von a aller Zeilen, wo b=5 ist, denn wirklich 3? MySQL zeigt was ZUFÄLLIGES an für b, vermutlich abhängig von der Mondphase und der Windrichtung.
                  PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

                  Kommentar


                  • #10
                    AHHH es werde Licht. danke. Das bringt mich weiter und ich werde es in Zukunft berücksichtigen. Danke

                    Kommentar


                    • #11
                      Wirst du es auch schon in deiner aktuellen Abfrage berücksichtigen?
                      [COLOR=#A9A9A9]Relax, you're doing fine.[/COLOR]
                      [URL="http://php.net/"]RTFM[/URL] | [URL="http://php-de.github.io/"]php.de Wissenssammlung[/URL] | [URL="http://use-the-index-luke.com/de"]Datenbankindizes[/URL] | [URL="https://www.php.de/forum/webentwicklung/datenbanken/111631-bild-aus-datenbank-auslesen?p=1209079#post1209079"]Dateien in der DB?[/URL]

                      Kommentar

                      Lädt...
                      X