我正在用PHP编写电子邮件应用程序,并想检查是否由于某种原因而排除了电子邮件地址。 到目前为止,我有一个MySQL表:
CREATE TABLE if not exists ddt
(
ddtID int PRIMARY KEY NOT NULL AUTO_INCREMENT,
userID int NOT NULL,
ddtFrom text(50) NOT NULL COMMENT 'From address or part off, can match start or end only',
CONSTRAINT ddt_users_userID_fk FOREIGN KEY (ddtID) REFERENCES users (userID)
);
CREATE UNIQUE INDEX ddt_ddtID_uindex ON ddt (ddtID);
({ddt = Don't Deliver To
)
如果我在表格中输入完整的电子邮件地址,我没有任何问题,因为可以使用以下标准查询:select * from ddt where ddtFrom='test@example.com';
我无法解决(或迷失方向)的是如何匹配部分电子邮件地址。 例如。 ddt表包含
|ddtID |UserID |ddtFrom|
|1 |1 |%@example.com|
|2 |1 |noreply@%|
我想确定以下电子邮件地址是否不应该发送给:
john@example.com
jo@example.co.uk
noreply@theendoftheworld.org
hello@kitty.tv
(只有jo@example.co.uk和hello@kitty.tv才能收到电子邮件)。
如果我正相反(将通配符与表匹配),那么我可以做:select * From ddt where ddtFrom like '%.example.com';
,但我想在表中使用通配符。
任何帮助都将不胜感激,或者如果有人可以想到另一种方法来解决这个问题,那也将很棒。
(当前使用MySQL 5.7,但可以根据需要进行升级)
答案 0 :(得分:0)
执行此操作的一种方法是建立要检查查询的电子邮件表(使用SELECT ... UNION SELECT
结构,然后CROSS JOIN
将其发送到ddt
,测试每个电子邮件地址是否是LIKE
个值中的每个ddtFrom
。由于MySQL在数字上下文中将布尔值视为0或1,因此您可以使用MAX
等效于OR
函数来确定电子邮件是否与一个(或多个)排除字符串匹配。例如
SELECT email, MAX(email LIKE ddtFrom) AS excluded
FROM (SELECT CONVERT('john@example.com' USING latin1) AS email
UNION SELECT 'jo@example.co.uk'
UNION SELECT 'noreply@theendoftheworld.org'
UNION SELECT 'hello@kitty.tv') e
CROSS JOIN ddt
GROUP BY email
HAVING excluded = 0
输出:
email excluded
hello@kitty.tv 0
jo@example.co.uk 0
请注意,我必须使用CONVERT
来获取dbfiddle的隐式字符类型以使两个表匹配,您可能不需要在系统上使用它,在这种情况下,只需使用SELECT 'john@example.com' AS email
作为第一行表构建查询的内容。