Notschko: SQL: Gegeben:Ein Problem; Gesucht:SQL-Anfrage

Als Datenbank verwende ich MySQL5.
Ich implementiere ein Mail-System in PHP, welches aus 4Datenbank-Tabellen besteht.

mitglieder
--------------------------
  m_id(int)
  name(text)
--------------------------

mail
---------------------------
  mail_id(int)
  nachricht(text)
---------------------------

mail_ausgang
---------------------------
  ausgang_id(int)
  von_id(int)
  an_ids(text) // Speichert alle IDs (Trennzeichen ist ein Komma) der Mitglieder, an die die Mail gesendet wurde
  datum(datetime)
  betreff(text)
  mail_id
---------------------------

mail_eingang
---------------------------
  eingang_id(int)
  von_id(int)
  an_id(int)
  datum(datetime)
  betreff(text)
  mail_id
---------------------------

Ich suche einen (oder auch mehrere) SQL-Befehl(e) mit dem ich für jeden mail_ausgang-Eintrag alle Namen der Empfänger erhalte.

Es sollte jedoch keine SQL-Anfrage in einer Schleife ausgeführt werden, da dies den Server zu sehr auslastet.

Habt ihr irgendwelche Ideen?

Danke!

Gruß, Notschko

  1. hi,

    mail_ausgang

    ausgang_id(int)
      von_id(int)
      an_ids(text) // Speichert alle IDs (Trennzeichen ist ein Komma) der Mitglieder, an die die Mail gesendet wurde

    Ungünstig.
    Vernünftig Normalisieren erschiene mir an dieser Stelle besser.

    datum(datetime)
      betreff(text)
      mail_id

    Warum liegen diese Daten nicht direkt an der Nachricht?

    mail_eingang

    Brauchst du überhaupt einen separaten Ein- und Ausgang?

    Wenn du ablegst, wer eine Nachricht an wen sendet, hast du doch damit Ein- und Ausgang implizit.

    Ich suche einen (oder auch mehrere) SQL-Befehl(e) mit dem ich für jeden mail_ausgang-Eintrag alle Namen der Empfänger erhalte.

    Es sollte jedoch keine SQL-Anfrage in einer Schleife ausgeführt werden, da dies den Server zu sehr auslastet.

    Habt ihr irgendwelche Ideen?

    Beschäftige dich, nachdem du das Datenmodell verbessert hast, mit JOINs.
    http://aktuell.de.selfhtml.org/artikel/datenbanken/joins/
    http://aktuell.de.selfhtml.org/artikel/datenbanken/fortgeschrittene-joins/

    gruß,
    wahsaga

    --
    /voodoo.css:
    #GeorgeWBush { position:absolute; bottom:-6ft; }
  2. yo,

    zum einen solltest du dein datenbank-design ändern, so wie wahsaga gesagt hat. zum anderen kannst du ein workaround nehmen, indem du zwei abfragen kombinierst.

    die erste holt die spalte an_ids von der tabelle mail ausgang. die zweite abfrage benutzt die spalte mit den komma getrennten werden empfänger als string in der zweiten abfrage und dem IN operator.

    SELECT *
    FROM mitglieder
    WHERE id IN (hier_string_der_ersten_abfrage)

    Ilja