在我的数据库中,我有影响他们的操作和里程碑。我需要评估一个操作里程碑类型,它是一个文本字段,然后根据该值获取最大值及其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,但这不是我想要的。
答案 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
答案 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)