2012-08-11 109 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

相關問題