在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
值为1
且complementary_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 |
+----+---------+-------------------+------------------+-------------------+
答案 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
)。
但是,请注意,此类排序无法使用索引,并且在大型表上速度较慢。