Mehrere Zeilen in einer Row

rebel

Neuer Benutzer
Beiträge
4
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
 
Werbung:
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
 
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
 
Hallo Reiner,

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

02163 / 5719653

Gruss

Bernd
 
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

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.
 
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
 
Hi, lass uns mal heute Abend telefonieren. Bin ab ca. 18:30 erreichbar.

Sollte dann schnell erledigt sein.

Gruss

Bernd
 
Werbung:
Zurück
Oben