MySQL中如何对查询结果行按字母顺序排序并调整字段展示顺序
实现方案
你可以通过LEAST、GREATEST函数自动调整每行两个名称的先后顺序,再配合排序规则实现需求,修改后的查询语句如下:
SELECT DISTINCT LEAST(re1.name, re2.name) AS name1, GREATEST(re1.name, re2.name) AS name2 FROM Rating ra1 JOIN Reviewer re1 ON re1.rID = ra1.rID CROSS JOIN Rating ra2 JOIN Reviewer re2 ON re2.rID = ra2.rID WHERE ra1.mID = ra2.mID AND re1.rID != re2.rID ORDER BY name1, name2;
逻辑说明
LEAST(re1.name, re2.name)会自动取两个名字中字典序更小的放在第一个位置,GREATEST(re1.name, re2.name)会取字典序更大的放在第二个位置,自动完成每行内部的顺序调整,不需要手动交换值- 移除了原查询中
re1.rID > re2.rID的条件,因为函数已经统一了配对顺序,配合DISTINCT可以自动去除重复的逆序配对 - 最终的
ORDER BY name1, name2会让整个结果集先按第一个名字升序排序,第一个名字相同时再按第二个名字升序排序,符合整体按字母顺序排序的要求
如果需要更好的兼容性,也可以用CASE WHEN实现相同效果:
SELECT DISTINCT CASE WHEN re1.name < re2.name THEN re1.name ELSE re2.name END AS name1, CASE WHEN re1.name < re2.name THEN re2.name ELSE re1.name END AS name2 FROM Rating ra1 JOIN Reviewer re1 ON re1.rID = ra1.rID CROSS JOIN Rating ra2 JOIN Reviewer re2 ON re2.rID = ra2.rID WHERE ra1.mID = ra2.mID AND re1.rID != re2.rID ORDER BY name1, name2;
内容的提问来源于stack exchange,提问作者goldenfish
相关产品推荐
相关产品推荐

