Marvin: SQL-Query

Hallo,

ich habe da mal eine SQL-Frage an Euch:

Ich habe eine Content-Tabelle (a), die eine Referenz-ID
auf einen Eintrag in einer Kategorie-Tabelle (b) besitzt
und somit ein Eintrag in (a) jeweils einer Kategorie
aus (b) zugeteilt ist. Es kann also kein Datensatz _ohne_
Kategorie existieren. In etwa so:
(a) id, cat_id, name, url [..]
(b) cat_id, name [..]

Nun gibts es zwei verschiedene Arten und Weisen mit denen
auf die Daten zugegriffen werden muss. Einmal (1) möchte
ich die neusten Datensätze _einer_ Kategorie auslesen (das
klappt bereits, siehe Anhang), des Weiteren (2) möchte ich
in einem(!) Statement gerne den neusten Eintrag zu _jeder_
Kategorie (aus jeder Kategorie nur einen, dne neusten, Eintrag).

Doch scheitere ich bisweilen an der Realisierung des letzen (2)
Statements und wäre glücklich über jede Hilfe.

Danke.
Marvin

SELECT DISTINCT
 modul.id,
 modul.category_id,
 modul.topic,
 modul.content,
 modul.member_id,
 modul.created,
 categories.category,
 member_pref.nickname
FROM
 nboard modul,
 nboard_categories categories
LEFT JOIN
 member ON modul.member_id=member.id
LEFT JOIN
 member_pref ON member.id=member_pref.member_id
WHERE
 categories.id=modul.category_id
AND
 categories.id=2
ORDER BY
 modul.created DESC
LIMIT 0, 4

  1. Hallo Marvin,

    [...] des Weiteren (2) möchte ich
    in einem(!) Statement gerne den neusten Eintrag zu _jeder_
    Kategorie (aus jeder Kategorie nur einen, dne neusten, Eintrag).

    die LIMIT-Klausel in Deinem Posting läßt mich vermuten, dass Du mit MySQL arbeitest. Gerade bei MySQL ist die Angabe der verwendeten Version unerläßlich, da Dein Problem am einfachsten mit einer korrelierenden Unterabfrage zu lösen ist. Diese unterstützt MySQL erst ab Version 4.1. Für andere DBMS sollte dies kein Problem darstellen.

    Doch scheitere ich bisweilen an der Realisierung des letzen (2)
    Statements und wäre glücklich über jede Hilfe.

    Wenn Du uns Dein DBMS verrätst, können wir Dir besser helfen.

    Freundliche Grüße

    Vinzenz

    1. OK, sorry,
      wusste nicht, dass die MySQL Versionen so differieren.
      Also: 4.1.7

      Danke
      Marvin

  2. yo,

    SELECT modul.id, modul.category_id .... modul.created, categories.category
    FROM nboard modul, nboard_categories categories
    WHERE categories.id=modul.category_id
    AND modul.created =
       (
       SELECT MAX(tab1.created)
       FROM nboard tab1
       WHERE tab1.category_id = modul.category_id
       )

    die anderen LEFT JOINS habe ich mir mal ersparrt.

    Ilja

    1. Super, besten Dank.

      Marvin