我有三个mysql表,'course','section'和'time_slot'。我会定期根据以非规范化形式提供的CSV数据文件更新这些表。即。
--------------------------------------------------
| subject | number | section | days | start_time |
--------------------------------------------------
| EDSC | 209 | A | M | 8:00 |
--------------------------------------------------
| EDSC | 209 | A | TR | 8:00 |
--------------------------------------------------
| EDSC | 209 | A | T | 8:00 |
--------------------------------------------------
etc...
注意:这些似乎重叠的原因是因为它们可能发生在不同的日期,但这与此问题无关
请注意,它们按星期几排序,多天条目在单日之前排序
我有这个sql查询试图匹配CSV的格式,然后以编程方式,我检查更新,添加,删除等。我的算法依赖于它们的顺序正确。
SELECT
c.subject, c.course_number, s.section_name,
t.days, t.start_time, t.end_time, t.building, t.room
FROM section s
JOIN course c on c.id=s.course_id
LEFT JOIN time_slot t on t.section_id=s.id
ORDER BY c.subject, c.course_number, s.section_name, t.start_time, t.days;
这会产生以下输出
--------------------------------------------------
| subject | number | section | days | start_time |
--------------------------------------------------
| EDSC | 209 | A | 1 | 8:00 |
--------------------------------------------------
| EDSC | 209 | A | 2 | 8:00 |
--------------------------------------------------
| EDSC | 209 | A | 2,4 | 8:00 |
--------------------------------------------------
etc...
注意,我在不添加自定义归类的情况下使用数字作为订购天数,并将CSV天数转换为代码中的数字
问题:有没有办法按最长字符串排在第一位的字段进行排序?我查看了LENGTH(t.days)DESC,但我还需要M来TR之前。
答案 0 :(得分:0)
订购部分问题的快速和durty解决方案是在订单条款中将'ZZZZZZ'字符串附加到字段中:
...
ORDER BY t.days || 'ZZZZZZ' ASC
...
这样,较短的字符串将被推到结果的底部,同时保留第一个字符的顺序。
只需确保'ZZZ'字符串足够长,而Z实际上是您域中的最后一个字符。
<强>解释强> 如果您有两个值'A'和'AA',那么您的目标是获得以下顺序:
如果您只是按字段订购:
这是因为缺少char比排序函数的任何其他char少。
所以你需要用最后一个字符替换缺少的字符来修复它,添加'ZZZZ'就是这样做,结果是: