Hallo Ronny!
2013/2/20 Ronny Seffner ronny@seffner.de:
Ich habe die drei Expressions mal je mit einfachen Klammern umschlossen
Stimmt, die hatte ich vergessen :)
%% This is replaced by a literal '%' character.
Ah, okay, wusste nicht dass postfix das einzelne % zerhaut.
SELECT IF ( (SELECT COUNT(*) FROM mail_virtual WHERE email = '%s') > 0, (SELECT policy_greylist FROM mail_users WHERE email = (SELECT destination FROM mail_virtual WHERE email = '%s')), (SELECT policy_greylist FROM mail_users WHERE email = (SELECT destination FROM mail_virtual WHERE iscatchall = 1 AND email LIKE CONCAT('%%@','%d'))) )
Und schon geht’s fast.
Siehste, da haben wir dir ja schon ein bisschen SQL beigebracht ;-)
Das Problem liegt nun warsch. in dem bei dir vorhandenen "AND policy='greylist'", denn meine Abfrage liefert einen leeren String (1 Zeile mit 1 Feld) zurück (eben den Wert von "greylist"), deins liefert 0 Zeilen zurück wenn policy nicht 'greylist' ist (zumindest denke ich das - ich hab kein testsetup wo ich das alles ausprobiere... mein Kopf ist mein SQL parser ;) ).
Bauen wir auch gleich noch dein gewünschtes Limit 1 mit ein, dann sieht es so aus:
SELECT IF ( (SELECT COUNT(*) FROM mail_virtual WHERE email = '%s') > 0, (SELECT policy_greylist FROM mail_users WHERE email = (SELECT destination FROM mail_virtual WHERE email = '%s') AND policy_greylist = 'greylist' LIMIT 1), (SELECT policy_greylist FROM mail_users WHERE email = (SELECT destination FROM mail_virtual WHERE iscatchall = 1 AND email LIKE CONCAT('%%@','%d')) AND policy_greylist = 'greylist' LIMIT 1) )
Gehts dann? Sonst ist der Fehler noch woanders ;)
Viele Grüße!