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

Mehrere Zeilen in einer Row

Dieses Thema im Forum "MySQL und MariaDB" wurde erstellt von rebel, 23 März 2015.

  1. rebel

    rebel Neuer Benutzer

    Hallo,

    ich habe ein Problem bei der Lösung einer SQL Anweisung.

    Ausgangspunkt sind 3 Tabellen:
    1. Tabelle
    dbmail_header
    Felder: physmessage_id, headername_id, headervalue_id
    2. Tabelle
    dbmail_headername
    Felder: id (headername_id in dbmail_header), headername
    3. Tabelle
    dbmail_headervalue
    Felder: id (headervalue_id in dbmail_header), headervalue


    Ich möchte z.B. auf Basis von physmessage_id = 106 und aus dbmail_headername die headernamen ('from','to','date','subject') die daraus sich ergebenen headervalue - Inhalte in einer Row ausgeben in der Form:
    physmessage_id, 'from', 'to', 'date', 'subject'

    Wie kann man so eine Abfrage erstellen?

    Gruß

    Reiner
     
  2. BerndB

    BerndB Datenbank-Guru

    Hi Rebel,

    join ist das Stichwort.

    So sollte es gehen, wenn in jeder Tabelle nur eine Zeile mit der ID (106) ist.

    Code:
    SELECT
      hn.from,
      hn.to,
      hn.date,
      hn.subject,
      hv.headervalue
    FROM dbmail_header h
    LEFT JOIN dbmail_headername hn on hn.id = h.headername_id
    LEFT JOIN dbmail_headervalue hv on hv.id = h.headervalue_id
    WHERE h.headername_id = 106;
    
    Gruss

    Bernd
     
  3. rebel

    rebel Neuer Benutzer

    Danke für die schnelle Antwort. Leider ist es so, dass es mehrere Zeilen in der Tabelle dbmail_header gibt, welche sich auf die Id 106 beziehen.
    Hier mal ein kleiner Auszug aus den Tabellen: (die Daten für headervalue sind zu umfangreich, daher lasse ich sie mal weg)

    Code:
    CREATE TABLE `dbmail_header` (
      `physmessage_id` bigint(20) unsigned NOT NULL,
      `headername_id` bigint(20) unsigned NOT NULL,
      `headervalue_id` bigint(20) unsigned NOT NULL,
      PRIMARY KEY (`physmessage_id`,`headername_id`,`headervalue_id`),
      KEY `physmessage_id` (`physmessage_id`),
      KEY `headername_id` (`headername_id`),
      KEY `headervalue_id` (`headervalue_id`),
      KEY `physmessage_id_headername_id` (`physmessage_id`,`headername_id`),
      KEY `physmessage_id_headervalue_id` (`physmessage_id`,`headervalue_id`),
      KEY `headername_id_headervalue_id` (`headername_id`,`headervalue_id`),
      CONSTRAINT `dbmail_header_ibfk_1` FOREIGN KEY (`physmessage_id`) REFERENCES `dbmail_physmessage` (`id`) ON DELETE CASCADE ON UPDATE CASCADE,
      CONSTRAINT `dbmail_header_ibfk_2` FOREIGN KEY (`headername_id`) REFERENCES `dbmail_headername` (`id`) ON DELETE CASCADE ON UPDATE CASCADE,
      CONSTRAINT `dbmail_header_ibfk_3` FOREIGN KEY (`headervalue_id`) REFERENCES `dbmail_headervalue` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
    
    INSERT INTO `dbmail_header` VALUES (106,1,73),(106,2,332),(106,2,334),(106,2,335),(106,2,336),(106,3,337),(106,4,339),(106,5,65),(106,6,338),(106,7,74),(106,8,59),(106,9,52),(106,10,57),(106,12,333),(106,13,59),(106,14,60),(106,15,64),(106,16,69),(106,17,340),(106,18,64),(106,19,341),(106,20,72);
    
    
    CREATE TABLE `dbmail_headername` (
      `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
      `headername` varchar(255) NOT NULL DEFAULT '',
      PRIMARY KEY (`id`),
      UNIQUE KEY `headername` (`headername`)
    ) ENGINE=InnoDB AUTO_INCREMENT=26 DEFAULT CHARSET=utf8;
    
    INSERT INTO `dbmail_headername` VALUES (7,'content-type'),(6,'date'),(14,'delivered-to'),(18,'disposition-notification-to'),(21,'dkim-signature'),(5,'from'),(4,'message-id'),(9,'mime-version'),(2,'received'),(25,'reply-to'),(1,'return-path'),(15,'return-receipt-to'),(3,'subject'),(17,'thread-index'),(8,'to'),(16,'x-mailer'),(13,'x-original-to'),(19,'x-provags-id'),(10,'x-spam-checker-version'),(11,'x-spam-level'),(12,'x-spam-status'),(20,'x-ui-out-filterresults'),(23,'x-yahoo-newman-id'),(22,'x-yahoo-newman-property'),(24,'x-ymail-osg');
    
    CREATE TABLE `dbmail_headervalue` (
      `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
      `hash` varchar(255) NOT NULL,
      `headervalue` text NOT NULL,
      `sortfield` varchar(255) DEFAULT NULL,
      `datefield` datetime DEFAULT NULL,
      PRIMARY KEY (`id`),
      KEY `hash` (`hash`),
      KEY `headervalue` (`headervalue`(255)),
      KEY `sortfield` (`sortfield`),
      KEY `datefield` (`datefield`)
    ) ENGINE=InnoDB AUTO_INCREMENT=342 DEFAULT CHARSET=utf8;
    
    Gruß

    Reiner
     
  4. BerndB

    BerndB Datenbank-Guru

    Hallo Reiner,

    du kannst gerne noch anklingeln. das geht schneller als das hin und her schreiben

    02163 / 5719653

    Gruss

    Bernd
     
  5. akretschmer

    akretschmer Datenbank-Guru

    Nach Deiner Schilderung gar nicht. Du hast zwar sicherlich je Message (Mail) definierte Header, aber es fehlt in Deiner Tabellenbeschreibung eine Verbindung der konkreten Message über den Header zum Inhalt dessen.
     
  6. rebel

    rebel Neuer Benutzer

    Hallo Bernd,
    ich hatte deine Nachricht zu spät gesehen, sonst hätte ich noch angeklingelt.
    Die Nachrichten benötige ich für meine Lösung nicht, da hier nur die Header ausgewertet werden sollen.

    Ich hatte es so versucht - jedoch ohne Erfolg.

    Code:
    SELECT t1.physmessage_id, t2.headervalue as value1, t3.headervalue as value2, t4.headervalue as value3, t5.headervalue as value4
    FROM dbmail_header t1
       Left Join dbmail_headervalue t2 on t1.headervalue_id = t2.id and t1.headername_id = (select id from dbmail_headername where headername='date')
       Left Join dbmail_headervalue t3 on t1.headervalue_id = t3.id and t1.headername_id = (select id from dbmail_headername where headername='from')
       Left Join dbmail_headervalue t4 on t1.headervalue_id = t4.id and t1.headername_id = (select id from dbmail_headername where headername='return-path')
       Left Join dbmail_headervalue t5 on t1.headervalue_id = t5.id and t1.headername_id = (select id from dbmail_headername where headername='subject')
    WHERE t1.physmessage_id=106 and t1.headername_id in (select id from dbmail_headername where headername in('date','from','return-path','subject')) 
    Ich erhalte zwar nur die 4 gesuchten Felder, jedoch auch 4 Zeilen. Das ist genau das, was ich nicht haben möchte. Wo liegt mein Fehler hier?

    Gruß
    Reiner
     
  7. BerndB

    BerndB Datenbank-Guru

    Hi, lass uns mal heute Abend telefonieren. Bin ab ca. 18:30 erreichbar.

    Sollte dann schnell erledigt sein.

    Gruss

    Bernd
     
  8. BerndB

    BerndB Datenbank-Guru

    Kannst ruhig noch anrufen
    Gruss

    Bernd
     
  9. rebel

    rebel Neuer Benutzer

    Kann ich heute Abend anklingeln? Gestern hatte es nicht mehr geklappt.
     
  10. BerndB

    BerndB Datenbank-Guru

    Klar doch, kein Problem.

    bis später

    Gruss

    Bernd
     
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