我有一个MySQL表,其中包含一个包含VARCHAR数据的列。数据可以是以下类型:
我需要从表中提取数据并对与此列匹配的数据进行排序,我们称之为type
。排序应如下:
首先,以“Q%”开头的所有内容都要记住Q之后的整数也起作用(Q5应该在Q6之前)等。
以下是以“L%”开头的所有内容,与上述逻辑相同。下一个和后一个的'W%'只是简单的整数。
那么查询是什么,尤其是我需要编写的ORDER BY部分?我尝试了下面没有错误但没有按照我想要的顺序排列项目,我无法弄清楚它背后的逻辑:
SELECT * FROM table
ORDER BY
CASE type
WHEN type LIKE 'Q%' THEN 1
WHEN type LIKE 'L%' THEN 2
WHEN type LIKE 'W%' THEN 3
ELSE 4
END,
type ASC
我也试过FIELD(...)
,但我认为它根本没有考虑'Q%'之类的东西,尽管它既没有出错也没有正确排序。
任何提示或想法?
答案 0 :(得分:4)
这应该允许所需的订购。
ORDER BY FIELD(LEFT(type,1), 'Q', 'L', 'W')
, CAST(type AS UNSIGNED)
, CAST(SUBSTRING(type, 2) AS UNSIGNED)
first one确保这些字母按此顺序发生;任何开始的事情都会提前订购。这是一个好处,因为您首先需要纯数字,但如果没有考虑其他前缀,可能会导致问题。
第二个确保数字字符串在数字上排序(因此你不会得到像1, 11, 12, 100, 2
这样的东西。对于以字母开头的字符串,这通常会导致0(没有排序);尽管它会定位为未计数对于前缀(如果它们存在),在大多数纯数字之前。
第三部分与第二部分几乎完全相同,但对于前缀字符串有效。数字部分。
答案 1 :(得分:2)
第二列应根据列的整数值进行排序:
SELECT `type`
FROM `table`
ORDER BY
CASE
WHEN `type` LIKE 'Q%' THEN 1
WHEN `type` LIKE 'L%' THEN 2
WHEN `type` LIKE 'W%' THEN 3
ELSE 4
END,
CASE
WHEN `type` LIKE 'Q%' THEN CONVERT(SUBSTRING(`type`, 2), SIGNED)
WHEN `type` LIKE 'L%' THEN CONVERT(SUBSTRING(`type`, 2), SIGNED)
WHEN `type` LIKE 'W%' THEN CONVERT(SUBSTRING(`type`, 2), SIGNED)
ELSE CONVERT(`type`, SIGNED)
END
答案 2 :(得分:1)
好的..试试这个
如果您不希望在最终答案中按字段查看制造的订单..
xs
我通常避免使用*并且总是希望列出明确的字段以便清晰