如何通过表中的两个相关值进行排序

时间:2016-04-28 22:06:39

标签: mysql database sorting

在MySQL数据库中,我有一个表:

+----+---------+-------------------+------------------+-------------------+  
| id | file_id | file_name         | is_complementary | complementary_for |  
+----+---------+-------------------+------------------+-------------------+  
| 55 |      52 | photo.png         |                0 |              NULL |  
| 56 |      53 | photo_edit.png    |                1 |                52 |  
| 57 |      54 | card.png          |                0 |              NULL |  
| 58 |      55 | card_edit.png     |                1 |                54 |  
| 59 |      56 | photo_edit_2.png  |                1 |                52 |  
+----+---------+-------------------+------------------+-------------------+ 

表中包含“原始”文件(file_id)及其编辑副本(“补充文件”)的记录。如果该文件的原始is_complementary值为0,则is_complementary值为1complementary_for值表示file_id是指。

如何对这个表进行排序,如果显示原始文件,那之后的行就是显示原始文件的补充文件?我的目标是得到这样的结果:

+----+---------+-------------------+------------------+-------------------+ 
| id | file_id | file_name         | is_complementary | complementary_for | 
+----+---------+-------------------+------------------+-------------------+ 
| 55 |      52 | photo.png         |                0 |              NULL | 
| 56 |      53 | photo_edit.png    |                1 |                52 | 
| 59 |      56 | photo_edit_2.png  |                1 |                52 | 
| 57 |      54 | card.png          |                0 |              NULL | 
| 58 |      55 | card_edit.png     |                1 |                54 | 
+----+---------+-------------------+------------------+-------------------+ 

1 个答案:

答案 0 :(得分:1)

您可以尝试:

 SELECT *
 FROM <put table name here>
 ORDER BY IF(is_complimentary = 0, file_id, complimentary_for), is_complimentary

第一个排序标准使用原始文件的ID;原始文件及其所有补充文件在排序结果中彼此相邻。第二个标准将原始文件放在其补充文件之前。您可以添加file_id以获取按创建顺序排序的免费文件(或其他条件,例如file_name)。

但是,请注意,此类排序无法使用索引,并且在大型表上速度较慢。