我需要为用户查找电子邮件首选项。
此表包含用户可以接收的电子邮件类型,按类别细分。
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 :(得分: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 :(得分:1)
此查询不需要WHERE子句。它需要更严格的JOIN。以下是完整的查询以及上面的Mark Byers答案。
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;