Thomas Emmers: Mysql: Aus zwei Tabellen lesen

Hallo,

ich habe für eine Website News in einer Mysql-DB gespeichert. Die Tabelle articles dafür sieht etwas so aus:

artikel_id | headline | text | category_id
-----------------------------------------------------
123456 | Meine Headline | mein Text | allgemein
234567 | Noch eine Headline | mein Text | sport

Mit SELECT * FROM articles frage ich diese Datensätze ab.

Nun gibt es eine zweite Tabelle categories mit einer Beschreibung der Kategorien:

category_id | title
---------------------------------------
allgemein | Allgemeine New
sport | News zum Thema Sport

Ich möchte nun bei der Ausgabe der Artikel die Kategorie mit ausgeben, aber nicht die category_id aus der tabelle articles, sondern den Titel aus categories. Mit einem zweiten Query wäre das natürlich möglich, aber kann ich das auch mit einer Abfrage lösen? Zur Verfügung steht Mysql 4.x, wenn aber gut, wenn es auch auf 3.2x geht.

Danke schon mal
Thomas

  1. Hi,

    Mit einem zweiten Query wäre das natürlich möglich, aber kann ich das auch mit einer Abfrage lösen?

    sicher doch. Joins beherrscht auch MySQL seit Urzeiten.

    Cheatah

    --
    X-Self-Code: sh:( fo:} ch:~ rl:° br:> n4:& ie:% mo:) va:) de:] zu:) fl:{ ss:) ls:~ js:|
    X-Self-Code-Url: http://emmanuel.dammerer.at/selfcode.html
    X-Will-Answer-Email: No
    X-Please-Search-Archive-First: Absolutely Yes
  2. Hallo,

    Die Tabelle articles dafür sieht etwas so aus:

    artikel_id | headline | text | category_id

    123456 | Meine Headline | mein Text | allgemein
    234567 | Noch eine Headline | mein Text | sport

    Tabelle categories mit einer Beschreibung der Kategorien:

    category_id | title

    allgemein | Allgemeine New
    sport | News zum Thema Sport

    Ich möchte nun bei der Ausgabe der Artikel die Kategorie mit ausgeben, aber nicht die category_id aus der tabelle articles, sondern den Titel aus categories.

    Das ist etwas, was SQL schon immer konnte. Es nennt sich JOIN. Voraussetzung für einen JOIN zweier Tabellen ist, dass die Tabellen in Beziehung zueinander gesetzt werden können. Das erfordert ein Feld, welches in beiden Tabellen identische Daten enthält. Bei Dir wäre das das Feld category_id:

    categories:                articles:
    category_id--1---+         artikel_id
    title            |         headline
                     |         text
                     +------n--category_id

    Über dieses Feld lässt sich eine 1:n-Beziehung zwischen den beiden Tabellen beschreiben.

    Eine JOIN-Abfrage der Tabellen sähe, nach ANSI-SQL so aus:

    SELECT articles.artikel_id, articles.headline, articles.text, categories.title FORM articles INNER JOIN categories ON articles.category_id = categories.category_id

    MySQL kann das, den INNER JOIN, auch über eine WHERE-Klausel:

    SELECT articles.artikel_id, articles.headline, articles.text, categories.title FORM articles, categories WHERE articles.category_id = categories.category_id

    http://dev.mysql.com/doc/mysql/en/JOIN.html

    viele Grüße

    Axel

    1. Man ersetzt jeweils FORM durch FROM:

      SELECT articles.artikel_id, articles.headline, articles.text, categories.title FROM articles INNER JOIN categories ON articles.category_id = categories.category_id

      SELECT articles.artikel_id, articles.headline, articles.text, categories.title FROM articles, categories WHERE articles.category_id = categories.category_id

      viele Grüße

      Axel

  3. Hi,

    danke euch beiden. Ich werde mich dann mit JOIN mal etwas genauer beschäftigen.

    Thomas