Hi,
Das Problem ist die WHERE-Bedingung, die zieht "zu spät".
Ok, da wäre ich nie drauf gekommen.
Ich sah das WHERE und verdächtigte es, die bereits gejointe Menge zu plündern statt nur meinetabelle zu beschränken.
So im Nachhinein und vor allem mit Deiner anschließenden Erklärung zur Abarbeitungsweise der Klauseln hört es sich so easy und logisch an. Aber das ist ja oft so, wenn man die Lösung erst mal kennt.
Ich habe auf jeden Fall hier im Thread jede Menge neu gelernt, nicht zuletzt auch, wie ich mithelfen kann, einem Helfer mein Problem nachzuvollziehen. Die Idee mit dem Codebeispiel war klasse! Erst das hat uns letztlich wirklich geholfen, abgesehen von Deiner Geduld und Deinem Willen, mir zu helfen.
Ich habe natürlich gleich beide Lösungen ausprobiert. Ein davon klappt vorzüglich, in der anderen habe ich einen Syntaxfehler und weiß nicht, welchen.
Diese hier klappt:
CREATE TEMPORARY TABLE `tmp` (
`ID` INT( 2 ) NOT NULL AUTO_INCREMENT PRIMARY KEY ,
`Monat` VARCHAR( 10 ) NOT NULL
) ENGINE = MYISAM ;
INSERT INTO `tmp` (`ID`, `Monat`) VALUES
(1, '2010|10'),
(2, '2010|09'),
(3, '2010|08'),
(4, '2010|07'),
(5, '2010|06');
CREATE TEMPORARY TABLE meinetabelle (
ID int(10),
Unixstamp varchar (10) NOT NULL,
`loesch` INT( 1 ) NOT NULL ,
`Status` VARCHAR( 10 ) NOT NULL
);
INSERT INTO meinetabelle VALUES
(1, UNIX_TIMESTAMP(NOW()),'0','qq'),
(2, UNIX_TIMESTAMP(NOW() - INTERVAL 1 MONTH),'0','qq'),
(3, UNIX_TIMESTAMP(NOW() - INTERVAL 1 MONTH),'0','qq'),
(4, UNIX_TIMESTAMP(NOW() - INTERVAL 3 MONTH),'0','qq');
SELECT *, FROM_UNIXTIME(m.Unixstamp, '%Y|%m')
FROM tmp t
LEFT JOIN meinetabelle m ON t.Monat = FROM_UNIXTIME(m.Unixstamp, '%Y|%m') AND
loesch != 1 AND
Status = 'xx'
GROUP BY t.Monat DESC;
Und bei dieser, die Du als die zu bevorzugendere bezeichnest:
CREATE TEMPORARY TABLE `tmp` (
`ID` INT( 2 ) NOT NULL AUTO_INCREMENT PRIMARY KEY ,
`Monat` VARCHAR( 10 ) NOT NULL
) ENGINE = MYISAM ;
INSERT INTO `tmp` (`ID`, `Monat`) VALUES
(1, '2010|10'),
(2, '2010|09'),
(3, '2010|08'),
(4, '2010|07'),
(5, '2010|06');
CREATE TEMPORARY TABLE meinetabelle (
ID int(10),
Unixstamp varchar (10) NOT NULL,
`loesch` INT( 1 ) NOT NULL ,
`Status` VARCHAR( 10 ) NOT NULL
);
INSERT INTO meinetabelle VALUES
(1, UNIX_TIMESTAMP(NOW()),'0','qq'),
(2, UNIX_TIMESTAMP(NOW() - INTERVAL 1 MONTH),'0','qq'),
(3, UNIX_TIMESTAMP(NOW() - INTERVAL 1 MONTH),'0','qq'),
(4, UNIX_TIMESTAMP(NOW() - INTERVAL 3 MONTH),'0','qq');
SELECT *, FROM_UNIXTIME(m.Unixstamp, '%Y|%m')
FROM tmp t
LEFT JOIN
(select ID from meinetabelle
where
loesch != 1 AND
Status = 'xx'
)
meinetabelle m ON t.Monat = FROM_UNIXTIME(m.Unixstamp, '%Y|%m')
GROUP BY t.Monat DESC;
meint mysql, dass die Syntax falsch ist. Möglicherweise habe ich die Subquery falsch eingebettet? Ich seh aber nicht, inwiefern.
Viele Grüße und ein riesen Dankeschön an Dich
Frank