如何从电子邮件中选择@domain并使用mysql从另一个表中进行匹配

时间:2013-10-09 09:46:43

标签: mysql sql regex

我有两个表首先是用户表

+------------------------------------
|  Useid    |  user email    | name  |
|-----------|----------------|-----  |
|  1        | sara@yahoo.com |sara   |
+------------------------------------

第二是基础表

+-------------------------------
|fo_name           |  fo_email  |  
|----------------  |------------|
|Florida universty | @yahoo.com | 
---------------------------------

注意:首先我将按用户ID进行搜索..没有工作......任何人都可以帮忙..

select fo_name,fo_email
(select 
  d_users.user_id,
 SUBSTRING_INDEX(d_users.user_email,@) // some regex or substr code to cut domain
FROM d_users
where d_users.user_id = '1'
) as substr_email
from foundation
where fo_email = substr_email;

我想选择与user_email匹配的基础如何做到

regexsubstr_index或其他

用户电子邮件,如sara@yahoo.com或adam@hotmail.com

@ yahoo.com 这样的基础电子邮件或类似 @ hotmail.com

2 个答案:

答案 0 :(得分:1)

我想我明白你想要的东西:

select 
    f.fo_name, f.fo_email, d.user_id, d.substr_email
from
    foundation f
        inner join
    (select 
        d_users.user_id,
        RIGHT(user_email, (LENGTH(user_email) - LOCATE('@', user_email) + 1)) as substr_email
    FROM
        d_users
    where
        d_users.user_id = '1') d ON f.fo_email = d.substr_email;

虽然这是一种非常奇怪(糟糕)的连接表的方式,每次都计算外键。

<强>更新

好的,我已经更新了我的答案并在SQLFiddle上做了示例,所以请查看它 - here

答案 1 :(得分:0)

首先: 如果你有一个基础表,你的用户表应该有一个外键来指向这个表。

例如,您的用户表可以变为:

id
username
fk_foundation
name

因此,您的示例数据变为:

id = 1
username = sara
fk_foundation = id (of foundation table, in your example is not specified)
name = sara

您对当前表结构的查询可能是(但性能可能很糟糕):

select *
from user u
join foundation f
on u.email like '%' + f.fo_email
where f.fo_email = '@yahoo.com'

如果更改表结构,查询将变为:

select *
from user u
join foundation f
on u.fk_foundation = f.id
where f.fo_email = '@yahoo.com'

比第一次

更快