【问题标题】:How to make a custom sort order in mySQL and check the beginning of the strings?如何在 mySQL 中自定义排序顺序并检查字符串的开头?
【发布时间】:2014-07-17 14:28:46
【问题描述】:

我找到了几个questions on stackoverflow,它们处理自定义排序、自定义排序字母表。但是,我找不到我的问题的解决方案。

想象一下我们有一张这样的桌子:

 # videoid #
 F01
 F02
 F031
 F032
 G01
 G02
 GEO01
 PR011
 PR012
 TRI01
 TRI021
 TRI022
 VEK01

我们想按非字母排序,而不是 A-Z,它应该是 G、F、GEO、TRI、PR、VEK。为此,我必须定义自定义排序并考虑使用% 通配符来获取所有以例如开头的结果。 “F”。

我尝试了mysql的CASEWHEN查询,但是当有LIKE比较时它似乎不起作用:

SELECT * FROM `videos`
ORDER BY CASE `videoid`
    WHEN videoid LIKE 'G%' THEN 1
    WHEN videoid LIKE 'F%' THEN 2
    WHEN videoid LIKE 'GEO%' THEN 3
    WHEN videoid LIKE 'TRI%' THEN 5
    WHEN videoid LIKE 'PR%' THEN 4
    WHEN videoid LIKE 'VEK%' THEN 6
    ELSE 0
END

我的尝试

WHEN (LEFT(videoid, 1) = 'G') THEN 1
WHEN (LEFT(videoid, 1) = 'F') THEN 2
WHEN (LEFT(videoid, 3) = 'GEO') THEN 3
... 

也失败了。

我也尝试使用FIELD但没有成功:

SELECT * FROM `videos`
ORDER BY FIELD(videoid, 'G%','F%','GEO%','TRI%','PR%','VEK%');

什么是正确的 mysql 查询?

【问题讨论】:

  • 在 SQLFiddle.com 上发布您的表格并向我们展示。
  • @Ravinder:我是 sql fiddle 新手,我的尝试没有输出查询:sqlfiddle.com/#!2/7a5cf0/1

标签: mysql sorting


【解决方案1】:

您的语法错误。尝试这样的事情:-

SELECT * FROM `videos`
ORDER BY CASE 
WHEN `videoid` LIKE 'GEO%' THEN 3
WHEN `videoid` LIKE 'G%' THEN 1
WHEN `videoid` LIKE 'F%' THEN 2
WHEN `videoid` LIKE 'TRI%' THEN 4
WHEN `videoid` LIKE 'PR%' THEN 5
WHEN `videoid` LIKE 'VEK%' THEN 6
ELSE 0
END

这可能对你有帮助。

【讨论】:

  • 这甚至无法编译。
  • 感谢 Ankit,但我收到一条 mysql 错误消息,您的查询:#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'LIKE 'G%' THEN 1 WHEN LIKE 'F%' THEN 2 WHEN LIKE 'GEO%' THEN 3 WHEN LIKE 'TRI%' ' at line 3
  • 谢谢,这行得通!所以我的错误是在ORDER BY CASE videoid``中提到了videoid。
【解决方案2】:

您还可以执行以下操作。试试sqlfiddle

create table videos (
  videoid varchar(8) not null,
  video varchar(8)
)engine=InnoDB;

INSERT into videos(videoid, video) values('F01', 'F01');
INSERT into videos(videoid, video) values('F02', 'F02');
INSERT into videos(videoid, video) values('F031', 'F031');
INSERT into videos(videoid, video) values('F032', 'F032');
INSERT into videos(videoid, video) values('G01', 'G01');
INSERT into videos(videoid, video) values('G02', 'G02');
INSERT into videos(videoid, video) values('GEO01', 'GEO01');
INSERT into videos(videoid, video) values('PR011', 'PR011');
INSERT into videos(videoid, video) values('PR012', 'PR012');
INSERT into videos(videoid, video) values('TRI01', 'TRI01');
INSERT into videos(videoid, video) values('TRI021', 'TRI021');
INSERT into videos(videoid, video) values('TRI022', 'TRI022');
INSERT into videos(videoid, video) values('VEK01', 'VEK01');

select videoid, video
  , case
     when videoid like 'GEO%' then 3
     when videoid like 'F%' then 2
     when videoid like 'G%' then 1
     when videoid like 'PR%' then 4
     when videoid like 'TRI%' then 5
     when videoid like 'VEK%' then 6
    end v_ord
from videos
order by v_ord, videoid;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-22
    • 2016-12-19
    • 2021-07-29
    • 1970-01-01
    相关资源
    最近更新 更多