在我的数据库中,我有影响它们的操作和里程碑。我需要计算一个操作里程碑类型的值,它是一个文本字段,然后根据该值获得最大值及其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,但这不是我想要的。
发布于 2019-06-28 01:31:50
您可以使用:
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发布于 2019-06-28 01:51:35
我更喜欢将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发布于 2019-06-28 02:29:32
要在不创建单独的表、使用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)https://stackoverflow.com/questions/56796050
复制相似问题