2016-09-21 91 views
0

这里是想我做什么来:MySQL的通配符匹配子字符串两个领域

我有了几个领域一个MySQL数据库 - 我指的是字段是一个名为url_links

contact_emailsite_url

我在找的是一个简单的'更新'查询,如果有匹配,它将设置一个二进制标志。

在伪代码

更新url_links SET domainMatch = 1其中,{后@ CONTACT_EMAIL 的子串} = SITE_URL的{子 - 可能是http:// HTTPS:// https://www或任何网址 - 即只是域名}

因此,如果邮件是像[email protected]和域http://www.mywebsiteisgreat.com它不会匹配

,但如果电子邮件是[email protected]它将设置domainMatch字段为1 - 域匹配。

谢谢!

+0

谢谢马丁对于提高我的问题。虽然我们正在讨论这个问题 - 这里解释为什么解决方案有效的最佳做法是什么。我仍然试图围绕你可以用MySQL做的惊人的事情。我可以在PHP中使用循环来完成这些相同的事情,但是它更加直接在MYSQL中执行。如果我们可能还列出了对功能和链接的引用,以帮助读者理解事情是如何发生的,我们都会学到更多。再次感谢。 – Viktor

回答

1

尝试此查询:

UPDATE url_links 
SET domainMatch = 1 
WHERE SUBSTRING_INDEX(contact_email,'@', -1) 
LIKE CONCAT('%', SUBSTRING_INDEX(site_url,'.', -2), '%'); 

(我更新了这个与数据库中的实际字段名,所以我们可以测试它更容易)

+0

这不起作用,它没有在数据库中找到正确的电子邮件。这是因为数据库主要包含带有'http://'和'https://'的URLS - 它只能找到那些不好的记录,即缺少http://,所以更新的脚本需要去掉http:/// https://和http:// www。和https:// www或任何其他组合可能是http:// m。 也许这样做的方法是仅仅在URL字段中查找第一个点(。)之后的子字符串,它将覆盖大多数URLS – Viktor

+1

我刚刚对此有所了解。看看SUBSTRING_INDEX()是否有诀窍 –

+0

感谢您保持它 - 这并没有做太多 - 它仍然只是“找到”缺少http://的记录 - 即数据库中的错误。 :)我倾向于可能做2个查询 - a)将域名提取到它自己的字段中的查询让我们称之为'域',然后b)只要域名本身被隔离,您的查询就可以很好地工作。你怎么看?是否有可能做1查询? – Viktor