2012-10-29 198 views
2

我需要查找用戶的電子郵件首選項。MYSQL查詢返回空結果

此表包含用戶可以接收的電子郵件類型,按類別細分。

email_preferences_categories 

+----------+------------------+------+-----+---------+----------------+ 
| Field | Type    | Null | Key | Default | Extra   | 
+----------+------------------+------+-----+---------+----------------+ 
| id  | int(10) unsigned | NO | PRI | NULL | auto_increment | 
| name  | text    | YES |  | NULL |    | 
| overview | text    | YES |  | NULL |    | 
+----------+------------------+------+-----+---------+----------------+ 

此表包含他們偏好接收各種類型。如果他們沒有設置他們的首選項,這個表格將不會有任何行。

email_preferences 

+------------+---------------------------------+------+-----+---------+----------------+ 
| Field  | Type       | Null | Key | Default | Extra   | 
+------------+---------------------------------+------+-----+---------+----------------+ 
| id   | int(10) unsigned    | NO | PRI | NULL | auto_increment | 
| user_id | int(10) unsigned    | NO |  | NULL |    | 
| name  | text       | YES |  | NULL |    | 
| frequency | enum('Daily','Monthly','None') | YES |  | Daily |    | 
+------------+---------------------------------+------+-----+---------+----------------+ 

我需要構建一個MySQL查詢,返回對應的電子郵件偏好給定用戶名和頻率。

SELECT name, frequency 
FROM email_preferences 
LEFT JOIN email_preferences_categories using (name) 
WHERE user_id = 42 

我遇到了麻煩:如果用戶沒有設置他們的首選項,這個查詢不會返回任何行。我希望它爲缺少的電子郵件類別返回「每日」默認值。

+0

您需要在哪裏使用email_preferences_categories(字段名稱同時位於emaial_preferences和emaail_preferences_category中)?你不想首先從用戶表中獲取值嗎? –

+0

當用戶表爲空或缺少條目時,我需要email_preferences_categories。 –

回答

2

變化LEFT JOIN變爲RIGHT JOIN

... 
FROM email_preferences 
RIGHT JOIN email_preferences_categories 
... 

或者你也可以左右互換表:

... 
FROM email_preferences_categories 
LEFT JOIN email_preferences 
... 

這兩個選項都做同樣的事情 - 請確保您從email_preferences_categories得到所有行,即使沒有匹配的行email_preferences

您還需要更改連接條件,因爲您已經注意到了。


我想它返回「日報」的默認值是缺少電子郵件類別。

您可以使用IFNULL

SELECT name, IFNULL(frequency, 'Daily') AS frequency 
1

此查詢不需要WHERE子句。它需要更嚴格的JOIN。這裏是完整的查詢結合馬克拜爾斯上面的答案。

SELECT email_preferences_categories.name, IFNULL(frequency, 'Daily') AS frequency 
FROM email_preferences_categories 
LEFT JOIN email_preferences 
    ON email_preferences.name = email_preferences_categories.name 
    AND user_id = 42; 
+0

+1這是正確的。 –