MYSQL JOIN,MAX()值为ENUM

时间:2017-09-15 09:14:55

标签: mysql sql join enums max

我的数据库中有两个表:

user_id | user_name
--------+----------
1       |jim
2       |john

user_id | status
--------+----------
1       |ONE
2       |TWO
1       |THREE

状态是枚举,定义如下:

status enum('ONE','TWO','THREE') NOT NULL

这应该保证ONE是最低状态而三是最高状态。我以下列方式检索用户的状态:

 SELECT user_id, type, status, event_date, valid_from, valid_to
 FROM status_event
 WHERE user_id = 1
 ORDER BY status DESC
 LIMIT 1;

这给了我,就像预期的那样,状态为三,因为订单是使用状态的顺序。

现在我想编写SQL来检索所有用户及其最高状态值的列表。由于MAX()函数显然将状态值作为字符串进行比较并将TWO作为最大值返回,因此我遇到了麻烦。此外,我不知道如何加入它们,是否可以这样做?我需要子查询吗?

我想要的结果如下:

user_name| status
---------+----------
jim      |THREE
john     |TWO

2 个答案:

答案 0 :(得分:0)

不幸的是,MySQL有MAX() / MIN()和枚举的已知错误 - 使用字符串值而不是整数值。此错误不适用于ORDER BY。 (我不知道这是否已在最近版本中修复)。

但是,你可以完成你想要的。如果您想要状态最高的行:

SELECT se.*
FROM status_event se
WHERE se.status = (SELECT se2.status
                   FROM status_event se2
                   WHERE se2.user_id = se.user_id
                   ORDER BY se2.status DESC
                   LIMIT 1
                  );

对于每个用户一行:

SELECT DISTINCT se.user_id, se.status
FROM status_event se
WHERE se.status = (SELECT se2.status
                   FROM status_event se2
                   WHERE se2.user_id = se.user_id
                   ORDER BY se2.status DESC
                   LIMIT 1
                  );

答案 1 :(得分:0)

因为你可能知道enum上的MAX和ORDER BY使用 String 而不是 int

尝试编辑查询,删除limit 1并仅选择status。 您将看到没有给出正确的顺序。 这是枚举的状态DESC的顺序: 两个,三个,一个。

因此order by和max()都适用于string。

我的建议是使用INT而不是VARCHAR作为状态。

  

此外,我不知道如何加入它们,是否可以这样做?我需要子查询吗?

使用嵌套查询,您可以检索整数枚举的最大值,并将此检索的值放在外部查询条件中。