我的数据库中有两个表:
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
答案 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作为状态。
此外,我不知道如何加入它们,是否可以这样做?我需要子查询吗?
使用嵌套查询,您可以检索整数枚举的最大值,并将此检索的值放在外部查询条件中。