在一个简单的文件管理脚本中,我有一个files
表,如果我按extension
排序文件,它看起来像!:
| name | extension^|
+------+-----------+
| bear | MP4 |
| bird | PNG |
| frog | JPG |
| lion | AVI |
所以顶部有一个视频,然后是两个图像,然后是另一个视频。
如何使用order by按类型(所有图像,然后是所有视频等)对文件进行排序?
我可以有另一个用于类型定义的表或一个JSON文件:
{"image" : ["JPG", "PNG", "GIF"],
"video" : ["MP4", "AVI", "FLV"] }
答案 0 :(得分:5)
我建议使用mimetype而不是扩展名,因此您可以轻松按mimetype升序或降序排序。
| name | extension^| mimetype +------+-----------+----------- | frog | JPG | image/jpeg | bird | PNG | image/png | lion | AVI | video/avi | bear | MP4 | video/mp4
答案 1 :(得分:2)
您可以使用联结表来匹配扩展类型
Create table extension
( type varchar(20),
extension varchar(20)
);
INSERT INTO extension
values ( 'image', 'JPG'),
( 'image', 'PNG'),
( 'video', 'MP4'),
( 'video', 'AVI')
SELECT F.name, F.extension from files F
JOIN extension E
ON F.extension = E.extension
ORDER BY E.type
答案 2 :(得分:1)
添加第三列,如下所示:
| name | extension^| file_type|
+------+-----------+---------+
| bird | PNG | Img|
| lion | AVI | Vid|
| frog | JPG | Img|
| bear | MP4 | Vid|
然后:
SELECT *
FROM files
ORDER BY file_type
答案 3 :(得分:1)
您可以在files
表格中添加一列吗?如果是,请将其命名为type_id
,将其设为tinyint (1)
类型。然后根据extension
列中的值向该列插入值。像这样:
# UPDATE 'files' SET 'type_id'="1" WHERE 'extension'="MP4" OR 'extension'="AVI";
# UPDATE 'files' SET 'type_id'="2" WHERE 'extension'="PNG" OR 'extension'="JPG";
这样,类型1将表示视频,类型2将表示图像。
然后对每种内容类型执行相同操作。
然后按type_id
订购您的选择查询。
答案 4 :(得分:1)
在不改变架构的情况下,您实际上需要通过执行以下操作将排序逻辑硬编码到查询中:
SELECT
name,
extension,
(CASE extension
WHEN 'GIF' THEN 1
WHEN 'JPG' THEN 2
WHEN 'PNG' THEN 3
WHEN 'AVI' THEN 4
WHEN 'FLV' THEN 5
WHEN 'MP4' THEN 6
ELSE 7
END) AS sort_value
FROM table
ORDER BY sort_value ASC
答案 5 :(得分:1)
您可以使用" Case"声明添加从JSON数组中获取的信息。
在给出的例子中,它将是:
SELECT
name,
ext,
CASE ext
WHEN "MP4" THEN "movie"
WHEN "AVI" THEN "movie"
WHEN "FLV" THEN "movie"
WHEN "JPG" THEN "picture"
WHEN "PNG" THEN "picture"
WHEN "GIF" THEN "picture"
ELSE "unknown"
END
AS type
FROM test
ORDER BY type DESC,ext;
答案 6 :(得分:1)
如果你想在SQL中实现不是数字或词法的排序,那么你需要创建一个模式,允许你添加数据的数字或词汇排序 overop 。
例如:将文件扩展名映射到文件类型,并为每个类型分配一个值以按顺序排列。
CREATE TABLE files (
name VARCHAR(32),
ext VARCHAR(16),
PRIMARY KEY (name, ext),
INDEX (ext)
);
INSERT INTO files (name, ext) VALUES
('file1', 'jpg'),
('file2', 'avi'),
('file3', 'gif'),
('file4', 'mov'),
('aaaaa', 'txt');
CREATE TABLE filetypes (
typeid INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
type VARCHAR(32),
sortindex INTEGER,
PRIMARY KEY (typeid),
INDEX (sortindex)
);
INSERT INTO filetypes (type, sortindex) VALUES
('video',1), ('image', 0), ('text',99);
CREATE TABLE ext_to_type (
ext VARCHAR(16),
typeid INTEGER UNSIGNED,
PRIMARY KEY (ext),
INDEX (typeid)
);
INSERT INTO ext_to_type (ext, typeid) VALUES
('jpg', 2),
('gif', 2),
('avi', 1),
('mov', 1),
('txt', 3);
然后您的查询变为:
SELECT CONCAT(f.name, '.', f.ext) as 'filename'
FROM files f INNER JOIN ext_to_type et
ON f.ext = et.ext
INNER JOIN filetypes t
ON et.typeid = t.typeid
ORDER BY t.sortindex, f.name, f.ext
结果:
file1.jpg
file3.gif
file2.avi
file4.mov
aaaaa.txt
数据库内方法的好处是:
答案 7 :(得分:0)
您需要的是第三列或其他表,您可以为扩展类型设置订单。
| name | extension^| rank |
+------+-----------+---------+
| bird | PNG | 1|
| lion | AVI | 2|
| frog | JPG | 1|
| bear | MP4 | 2|
就我个人而言,我更喜欢另一张桌子,但如果您不熟悉连接等,这可能会使它更复杂一些。
我更喜欢桌子的原因是,它更具有未来的证据"意思是像这样的表
| extension^| rank |
+------------+-------+
| PNG | 1|
| AVI | 2|
| JPG | 1|
| MP4 | 2|
后者更容易找到图像文件的值,因为您可以查询它的扩展类型,而不是在向数据库添加数据时手动输入它们。
所以说他们从现在开始每年提出一个mp5,你必须在"同桌" case使代码更改,只需要插入新扩展名的2个表,并可能调整允许上传的文件类型(无论如何你都应该这样做。)