Information ausblenden
Willkommen im Forum für alle Datenbanken! Registriere Dich kostenlos und diskutiere über DBs wie Mysql, MariaDB, Oracle, Sql-Server, Postgres, Access uvm

Immer das neueste Bild pro Kategorie

Dieses Thema im Forum "MySQL und MariaDB" wurde erstellt von ncpschmidt, 9 Mai 2015.

  1. ncpschmidt

    ncpschmidt Benutzer

    Hallo Community,

    das ist mein erster Post und zugleich meine erste Frage. Vorweg erkläre ich kurz die Ausgangssituation:

    Tabellen inkl. wichtiger Spalten:
    Name: categories
    Spalten: id, name

    Name: photos
    Spalten: id, thumb, category

    Aktuelle Abfrage
    SELECT categories.id, categories.name, photos.category, photos.thumb
    FROM categories
    INNER JOIN photos ON photos.category = categories.id
    GROUP BY photos.category

    Dadurch frage ich alle Kategorien ab und erhalte jeweils ein zugehöriges Bild.
    Die gewünschte Abfrage soll bezwecken, dass immer das neuste Bild der jeweiligen Kategorie gezogen wird.

    Reicht hier ein einfacher Einschub von ORDER BY an der korrekten Stelle? Ich hoffe auf eine erfolgreiche Hilfestellung :).

    Beste Grüße
    Niels
     
  2. akretschmer

    akretschmer Datenbank-Guru


    Nein. Sonst würdest Du auch nicht fragen. In allen anderen DB-Systemen dieser Welt würdest Du einen Syntaxfehler bekommen, in MySQL 'nur' ein falsches Resultat. Was gefällt Dir besser: Syntaxfehler oder falsches Ergebnis?
     
  3. ncpschmidt

    ncpschmidt Benutzer

    Weder noch. Hast du denn eine Idee, wie ich diese Abfrage in MySQL korrekt umsetze?
     
  4. akretschmer

    akretschmer Datenbank-Guru

    Die SQL-Norm sagt sinngemäß: alle Spalten des Resultates müssen entweder aggregiert oder gruppiert sein. Alle 'richtigen' DB-Systeme prüfen das auch, und werfen einen Syntaxfehler, wenn man dagegen verstößt. MySQL ist halt zu behindertet, das zu erkennen. Haltedich einfach an diese Regel. Nutze besser gleich eine DB, die solche Fehler erkennt.
     
  5. ncpschmidt

    ncpschmidt Benutzer

    Also ist es nicht möglich, mit MySQL so eine Abfrage zu generieren? Ich bin recht neu in dem Themenbereich und arbeite mit MAMP auf dem Mac.
     
  6. Walter

    Walter Administrator Mitarbeiter

    Das ist mit keiner SQL-Datenbank möglich weil es keinen Sinn ergibt.

    Lies was Kretschmer geschrieben hat:
     
  7. akretschmer

    akretschmer Datenbank-Guru

    Möglich ist das schon, nur solltest Du Dich an die genannten Regeln halten. Wenn z.B. die ID strikt hochzählend ist, dann fragst Du erst einmal je Kategorie die höchste ID ab. Das Resultat dieser Anfrage kannst Du dann zum Joinen nehem, um 'den Rest' abzufragen.
     
  8. ncpschmidt

    ncpschmidt Benutzer

    Das ist ein logischer Ansatz, da hast du Recht. Magst du mir evtl. eine Abfrage zusammenstellen? Ich bin etwas überfordert bzgl. der Inner-, Left- & Rightjoinings.
    Das wäre totally awesome!

    Gruß
     
  9. ukulele

    ukulele Datenbank-Guru

    Du sucht in etwa sowas:
    Code:
    SELECT    categories.id,
            categories.name,
            p2.thumb
    FROM    categories
    LEFT JOIN (    SELECT    photos.category,
                        max(photos.id) AS id
                FROM    photos
                GROUP BY photos.category ) p1
    ON        categories.id = p1.category
    LEFT JOIN photos p2
    ON        categories.id = p2.category
    AND        p1.id = p2.id
    Das macht allerdings wirklich nur Sinn, wenn deine IDs aufsteigend vergeben werden. Wenn dem nicht so ist, fehlt deiner photos Tabelle die Information welches Foto das aktuellste ist.
     
  10. ncpschmidt

    ncpschmidt Benutzer

    Super! Die Abfrage funktioniert ohne Abänderungen super!
    Ich verstehe zwar noch nicht ganz, was es mit p1 und p2 auf sich hat, aber dafür ist mein Datenbankverständnis noch nicht ausgereift genug. Vielen Dank für die Hilfe!
     
  11. akretschmer

    akretschmer Datenbank-Guru

    Das sind lediglich Aliase.
     
  12. ukulele

    ukulele Datenbank-Guru

    In der Klammer wird zu jeder category die höchste photos.id per GROUP BY ermittelt. Das wiederum ist eine Tabelle die du per LEFT JOIN auf deine Haupttabelle joinst mit Alias p1. Den Wert aus thumb kannst du aber nicht sinnvoll aggregieren daher muss der nochmal separt gejoint werden, also als p2.
     
Die Seite wird geladen...

Diese Seite empfehlen

  1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden