Andi: Probleme beim Spalten auslesen

Hallo,

ich such nach eine vernünftigen Möglichkeit Daten aus meiner DB zu lesen.

Ich habe folgendan Aufbau.

id  |  bild  |  kategorie  |  standard
--------------------------------------
1   | bild1  |  1          |  0
2   | bild2  |  3          |  1
3   | bild5  |  1          |  0
4   | bild3  |  5          |  0
5   | bild4  |  5          |  0
6   | bild6  |  1          |  1
7   | bild8  |  3          |  0
8   | bild9  |  1          |  0

Ich möchte aus jeder Kategorie das Standardbild auslesen. Wenn keines Vorhanden ist soll das nächste genommen werden.

Wenn ich meine Tabelle einfach nach dem Standard durch sortiere bekomme ich alle Resultate. Doch das will ich vermeiden.

Es soll jeweils aus einer Kategorie die Standard Spalte bzw. wenn es keine gibt die nächste ausgewählt werden.

Gibts da ne möglichkeit das in einer Abfrage zu realisieren?

Danke euch schon mal,

MfG. Andi!

  1. Hallo Andi,

    id  |  bild  |  kategorie  |  standard

    1   | bild1  |  1          |  0
    2   | bild2  |  3          |  1
    3   | bild5  |  1          |  0
    4   | bild3  |  5          |  0
    5   | bild4  |  5          |  0
    6   | bild6  |  1          |  1
    7   | bild8  |  3          |  0
    8   | bild9  |  1          |  0

    select a.bild, a.kategorie from bild_kategorie a where a.id=(select min(b.id) from bild_kategorie b where a.kategorie=b.kategorie and b.standard in (select max(c.standard) from bild_kategorie c where a.kategorie=c.kategorie));

    Ergebnis:

    bild   | kategorie
    -------------------
    bild2  | 3
    bild3  | 5
    bild6  | 1

    Gruß

    Hans

  2. Hi,

    id  |  bild  |  kategorie  |  standard

    1   | bild1  |  1          |  0
    2   | bild2  |  3          |  1
    3   | bild5  |  1          |  0
    4   | bild3  |  5          |  0
    5   | bild4  |  5          |  0
    6   | bild6  |  1          |  1
    7   | bild8  |  3          |  0
    8   | bild9  |  1          |  0

    SELECT * FROM tabelle GROUP BY kategorie ORDER BY standard

    könnte ect das gewünschte ergebniss liefern, musst du testen bin mir nicht 100%ig sicher.

    MfG

    1. Hallo,

      SELECT * FROM tabelle GROUP BY kategorie ORDER BY standard

      könnte ect das gewünschte ergebniss liefern, musst du testen bin mir nicht 100%ig sicher.

      Super, Danke genau das was ich gesucht habe!
      MfG. Andi!

      1. Hallo Andi

        SELECT * FROM tabelle GROUP BY kategorie ORDER BY standard

        Ich zitiere aus dem von mir in https://forum.selfhtml.org/?t=109121&m=681195 verlinkten Handbuchabschnitt [1]:

        <zitat>
        Do not use this feature if the columns you omit from the GROUP BY part are not unique in the group! You get unpredictable results.
        </zitat>

        Super, Danke genau das was ich gesucht habe!

        Du suchst also unvorhersagbare Ergebnisse?
        Verwende lieber den Vorschlag von Hans!

        Freundliche Grüße

        Vinzenz

        [1] Die deutsche Übersetzung findest Du unter http://dev.mysql.com/doc/mysql/de/group-by-functions.html.

    2. Hallo Daniel

      id  |  bild  |  kategorie  |  standard

      SELECT * FROM tabelle GROUP BY kategorie ORDER BY standard

      Dieses Statement ist in Standard-SQL fehlerhaft. Wenn Du GROUP BY verwendest, ist es erforderlich, dass die in der SELECT-Liste auftretenden Felder in der GROUP-BY-Klausel auftauchen oder für das Feld eine Aggregatsfunktion verwendet wird.

      MySQL ist in diesem Fall meiner Meinung nach unnötigerweise fehlertolerant, da
      die Werte der Spalten id, bild und standard auf Zufall beruhen, siehe MySQL-Handbuch.

      Freundliche Grüße

      Vinzenz

      1. Hi,

        MySQL ist in diesem Fall meiner Meinung nach unnötigerweise fehlertolerant, da
        die Werte der Spalten id, bild und standard auf Zufall beruhen

        deshalb ja das ORDER BY, denke mir das die werte dann nach standard
        sortiert werden und MySQL nimmt AFAIK nicht zufällige sondern den ersten
        wert der sortierten tabelle bei dem die kategorie zutrifft und
        ignoriert alle weiteren. zumindest hab ich mir das so gedacht und habe
        ja gesagt das ich nicht weis ob es (fehlerfrei) funktioniert und er es
        testen soll.

        MfG

        1. Hallo Daniel

          MySQL ist in diesem Fall meiner Meinung nach unnötigerweise fehlertolerant, da
          die Werte der Spalten id, bild und standard auf Zufall beruhen

          deshalb ja das ORDER BY, denke mir das die werte dann nach standard
          sortiert werden und MySQL nimmt AFAIK nicht zufällige sondern den ersten

          Nein, MySQL nimmt zufällige, siehe https://forum.selfhtml.org/?t=109121&m=681219 bzw. MySQL-Handbuch

          wert der sortierten tabelle bei dem die kategorie zutrifft und
          ignoriert alle weiteren. zumindest hab ich mir das so gedacht und habe
          ja gesagt das ich nicht weis ob es (fehlerfrei) funktioniert und er es
          testen soll.

          Leider falsch gedacht. Wenn zufällig beim derzeitigen Datenbestand das richtige rauskommt, heisst das noch lange nicht, dass bei einer weiteren Abfrage das gleiche Ergebnis herauskommt: "unpredictable results" ist eine eindeutige Formulierung. Auf so etwas würde ich mich nie verlassen.

          Freundliche Grüße

          Vinzenz

      2. yo,

        MySQL ist in diesem Fall meiner Meinung nach unnötigerweise fehlertolerant, da
        die Werte der Spalten id, bild und standard auf Zufall beruhen, siehe MySQL-Handbuch.

        nicht wirklich fehlertolerant, mysql setzt aber vorraus, dass der user wisse wie er es richtig benutzten darf, quasi blindes vertrauen. unter mysql können sehr wohl spalten mit angezeigt werden, die weder aggregat-funtion sind noch in der group by klausel vorkommen. sie müsen halt nur alle den gleich wert in der jeweiligen gruppierung besitzen. damit will sich mysql ein sortierungen ersparren. und wenn alle werte gleich sind, dann klappt das auch mit der zufälligen auswahl....

        Ilja