【问题标题】:MYSQL query return empty resultMYSQL查询返回空结果
【发布时间】:2012-10-29 15:06:36
【问题描述】:

我需要查找用户的电子邮件首选项。

此表包含用户可以接收的电子邮件类型,按类别细分。

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

我遇到问题的地方:如果用户没有设置他们的偏好,这个查询不会返回任何行。我希望它为缺少的电子邮件类别返回默认的“每日”。

【问题讨论】:

  • 您在哪里需要 email_preferences_categories(字段名称在 emaial_preferences 和 emaail_preferences_category 中)?你不想先从用户表中获取值吗?
  • 当用户表为空或缺少条目时,我需要 email_preferences_categories。

标签: mysql


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    此查询不需要 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; 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-10-21
      • 2012-10-08
      • 1970-01-01
      • 1970-01-01
      • 2021-03-18
      • 2021-11-20
      • 2019-10-13
      • 1970-01-01
      相关资源
      最近更新 更多