2012-08-11 67 views
0

这已被问到,但我不太满意现有的问题与我的案例。 我有两个表,第一表是credentialsidusernameemail如果结果不匹配,请从另一张表中选择

email-aliasuser-id(其对应于credentials.id)和emailcredentials中的电子邮件通常是“[email protected]”,而在别名中则是“[email protected]”。

所有我现在已经是

SELECT `username` FROM `credentials` WHERE `email` LIKE ? 

但是,如果我用“[email protected]”查询电子邮件并不总是匹配。我想要做的就是使用一个查询的用户名这将回落到email-alias和使用“[email protected]”获得从那里的user-id要在credentials再次用于匹配username

的缺陷是您提供的邮箱可能是任何一个别名一个“用户N @ ..”或“user.name @ ..”

mysql> describe `email-alias`; 
+---------+--------------+------+-----+---------+----------------+ 
| Field | Type   | Null | Key | Default | Extra   | 
+---------+--------------+------+-----+---------+----------------+ 
| id  | int(11)  | NO | PRI | NULL | auto_increment | 
| user-id | int(11)  | NO | UNI | NULL |    | 
| email | varchar(100) | YES |  | NULL |    | 
+---------+--------------+------+-----+---------+----------------+ 


mysql> describe `credentials`; 
+-----------------+--------------+------+-----+---------------------+----------------+ 
| Field   | Type   | Null | Key | Default    | Extra   | 
+-----------------+--------------+------+-----+---------------------+----------------+ 
| id    | int(11)  | NO | PRI | NULL    | auto_increment | 
| username  | varchar(100) | NO | UNI | NULL    |    | 
| email   | varchar(100) | NO |  | NULL    |    | 
+-----------------+--------------+------+-----+---------------------+----------------+ 
+0

说实话,这是令人困惑的。 – 2012-08-11 15:10:05

+0

使用INNER JOIN? – 2012-08-11 15:14:48

回答

2

你的问题是怎么样的混乱,但我认为你正在试图做的是从第一个表中选择username如果email存在,如果它不”如果存在,则从第二个表中选择。你会使用子查询。希望这可以帮助。

SELECT `c.username` 
FROM credentials c 
WHERE c.email = '[email protected]' OR c.id = 
(SELECT `e.user-id` from email-alias e WHERE e.email = "[email protected]") 
+0

是的,这似乎更有可能。 OR从左向右进行评估时,并不总是必须执行第二个查询我认为 – Recct 2012-08-11 15:36:00

+0

是的,如果电子邮件是别名(即嵌套查询必须运行) – Recct 2012-08-11 15:46:34

+0

这是否可以解决您的问题? – jocey 2012-08-11 15:48:22

1

我不知道如果我理解你的问题清楚,因为它太混乱。但让我试试这个。您需要使用INNER JOIN加入表格。

SELECT `username` 
FROM credentials a 
      INNER JOIN email_alias b 
       on a.ID = b.userID 
WHERE b.email = '[email protected]' 

更新1

SELECT `username` 
FROM credentials a 
      INNER JOIN email_alias b 
       on a.ID = b.userID 
WHERE b.email LIKE '%[email protected]%' 
+0

是的,这工作正常,如果提供的电子邮件参数是别名地址,但我不认为它会工作,如果电子邮件不是别名,这也是一种可能性 – Recct 2012-08-11 15:25:18

+0

好吧。你能提供示例记录吗?和样本输出也.. – 2012-08-11 15:27:36

+0

看到我更新的答案@Recc – 2012-08-11 15:28:52

相关问题