我的SQL按顺序改变顺序

时间:2014-10-07 18:49:20

标签: php mysql

在一个简单的文件管理脚本中,我有一个files表,如果我按extension排序文件,它看起来像!:

| name | extension^|
+------+-----------+
| bear |    MP4    |
| bird |    PNG    |
| frog |    JPG    |
| lion |    AVI    |

所以顶部有一个视频,然后是两个图像,然后是另一个视频。

如何使用order by按类型(所有图像,然后是所有视频等)对文件进行排序?

我可以有另一个用于类型定义的表或一个JSON文件:

{"image" : ["JPG", "PNG", "GIF"],
 "video" : ["MP4", "AVI", "FLV"] }

8 个答案:

答案 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;

请参阅小提琴:http://sqlfiddle.com/#!2/69d243/9

答案 6 :(得分:1)

如果你想在SQL中实现不是数字或词法的排序,那么你需要创建一个模式,允许你添加数据的数字或词汇排序 overop

例如:将文件扩展名映射到文件类型,并为每个类型分配一个值以按顺序排列。

SQLfiddle of below.

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

数据库内方法的好处是:

  1. 您可以通过应用程序更改订单并在数据库中添加更多类型,而不是每次要添加新文件类型时必须返回并编辑源代码中的查询的其他方法。改变订购。
  2. 不是通过条件表达式排序,而是利用已定义的索引。

答案 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个表,并可能调整允许上传的文件类型(无论如何你都应该这样做。)