SELECT MAX CASE的问题

时间:2019-06-27 17:29:32

标签: mysql case

在我的数据库中,我有影响他们的操作和里程碑。我需要评估一个操作里程碑类型,它是一个文本字段,然后根据该值获取最大值及其ID。让我们假设operation.id = 1来简化。

我在里程碑表中

id | type   | operation_id
1  | 'Ori'  | 1
2  | 'Lib'  | 1
3  | 'Desc' | 1

我尝试过:

SELECT m.id,
MAX(CASE
    WHEN m.type = 'Ori'   THEN 0
    WHEN m.type = 'Trans' THEN 1
    WHEN m.type = 'Arriv' THEN 2
    WHEN m.type = 'Ofic'  THEN 3
    WHEN m.type = 'Lib'   THEN 4
    WHEN m.type = 'Ret'   THEN 5
    WHEN m.type = 'Desc'  THEN 6
    WHEN m.type = 'Dev'   THEN 7
END) val
FROM milestone m WHERE m.operation_id = 1

我希望得到的东西:

id | val
3  | 6

我得到了什么:

id | val
1  | 6

如果我添加到查询中:GROUP BY m.id

我得到:

id | val
1  | 0
2  | 4
3  | 6

我知道我可以按val排序,然后将结果限制为1,但这不是我想要的。

3 个答案:

答案 0 :(得分:0)

您可以使用:

SELECT *
FROM milestone m 
WHERE m.operation_id = 1
ORDER BY 
  (CASE
    WHEN m.type = 'Ori'   THEN 0
    WHEN m.type = 'Trans' THEN 1
    WHEN m.type = 'Arriv' THEN 2
    WHEN m.type = 'Ofic'  THEN 3
    WHEN m.type = 'Lib'   THEN 4
    WHEN m.type = 'Ret'   THEN 5
    WHEN m.type = 'Desc'  THEN 6
    WHEN m.type = 'Dev'   THEN 7
  END) DESC
LIMIT 1

答案 1 :(得分:0)

我更愿意将type及其value保留在单独的表(TypeValue)或临时表中,因此很容易与里程碑表结合以获得预期的结果:

CREATE TABLE milestone (id integer, `type` varchar (5), operation_id integer);

INSERT INTO milestone (id, `type`, operation_id) VALUES
(1, 'Ori', 1),
(2, 'Lib', 1),
(3, 'Desc', 1);

CREATE TABLE TypeValue (`type` varchar (5), value integer);

INSERT INTO TypeValue ( `type`, value) VALUES
('Ori'  , 0),
('Trans', 1),
('Arriv', 2),
('Ofic' , 3),
('Lib'  , 4),
('Ret'  , 5),
('Desc' , 6),
('Dev'  , 7);

有效查询是:

SELECT m.id, t.value
FROM milestone m 
JOIN TypeValue t on t.`type` = m.`type`
WHERE m.operation_id = 1
ORDER BY t.value DESC
LIMIT 1;

结果:

id  | value 
------------
3   | 6

Demo on db<>fiddle

答案 2 :(得分:0)

要完成此操作而不创建单独的表(使用LIMIT或进行排序),可以使用内联表(表子查询)。

说实话,最好将值列表像Arulkumar一样放在单独的表中,然后将相关的值存储在里程碑表中。

这可以通过将每个里程碑ID及其类型值作为子查询进行匹配,然后将结果与另一个子查询进行匹配,该子查询返回operation_id的总体最大类型值。

Select * From
(SELECT m.id, 
    CASE
        WHEN m.type = 'Ori'   THEN 0
        WHEN m.type = 'Trans' THEN 1
        WHEN m.type = 'Arriv' THEN 2
        WHEN m.type = 'Ofic'  THEN 3
        WHEN m.type = 'Lib'   THEN 4
        WHEN m.type = 'Ret'   THEN 5
        WHEN m.type = 'Desc'  THEN 6
        WHEN m.type = 'Dev'   THEN 7
    END val
FROM milestone m) inlineTable
Where val = 
(Select Max(CASE
    WHEN type = 'Ori'   THEN 0
    WHEN type = 'Trans' THEN 1
    WHEN type = 'Arriv' THEN 2
    WHEN type = 'Ofic'  THEN 3
    WHEN type = 'Lib'   THEN 4
    WHEN type = 'Ret'   THEN 5
    WHEN type = 'Desc'  THEN 6
    WHEN type = 'Dev'   THEN 7
    END) from milestone
    WHERE operation_id = 1)