匹配表中的mysql通配符条目以进行查询

时间:2019-04-01 15:35:31

标签: php mysql

我正在用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,但可以根据需要进行升级)

1 个答案:

答案 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

Demo on dbfiddle

请注意,我必须使用CONVERT来获取dbfiddle的隐式字符类型以使两个表匹配,您可能不需要在系统上使用它,在这种情况下,只需使用SELECT 'john@example.com' AS email作为第一行表构建查询的内容。