+------+-----------------+
| id | name +
+------+-----------------+
| 1 | David Gilmour |
| 2 | Roger Waters |
| 3 | Li Jen Ho |
+------+-----------------+
名称的当前格式为firstName lastName
,我想将其更改为lastName firstName
,我想在一个数据库查询中将其更改。
我想到的解决方案是按space
分割名称,翻转项目,然后再用space
胶水将它们重新打印。但我不知道如何为此编写查询。
我可以简单地在PHP中通过按空格爆炸名称并将它们放入数组中,反转数组然后通过空间胶水来破坏单词,但目前我无法访问PHP。
更新1:我找到了this similar question,但我无法让它发挥作用。我希望我不是问一个重复的问题。
更新2:名称可以包含2个以上的部分。我假设只有第一个单词是名字,其余名字是姓氏。
答案 0 :(得分:1)
试试这个:
select concat(last_name," ",first_name) as FullName
from
(
select SUBSTRING_INDEX(SUBSTRING_INDEX(name, ' ', 2), ' ', -1) AS last_name,
SUBSTRING_INDEX(SUBSTRING_INDEX(name, ' ', 1), ' ', -1) AS first_name
from your_table
) tab
查看此处的示例
http://sqlfiddle.com/#!2/cd4ee/4
修改强>
然后一个轻微的修改版本将完成您的工作。您可以根据需要推荐同一小提琴,以获取更新的样本。
select concat(last_name," ",first_name) as FullName
from
(
select right(name,(length(name) - instr(name,' '))) as last_name,
SUBSTRING_INDEX(SUBSTRING_INDEX(name, ' ', 1), ' ', -1) AS first_name
from tab
) tab1
答案 1 :(得分:0)
这里使用3个部分名称:http://sqlfiddle.com/#!2/e2b03e/7
SELECT
SUBSTRING_INDEX(SUBSTRING_INDEX(name, ' ', 1), ' ', -1) AS first_name,
If( length(name) - length(replace(name, ' ', ''))>1,
SUBSTRING_INDEX(SUBSTRING_INDEX(name, ' ', 2), ' ', -1) ,NULL)
as middle_name,
SUBSTRING_INDEX(SUBSTRING_INDEX(name, ' ', 3), ' ', -1) AS last_name
from tab
在评论中,你提到想要将中间名和姓氏放在一个字段中,但不要这样做。这只是继续不好的做法,你无疑会得到按中间名等排序的名字。
答案 2 :(得分:0)
我知道我迟到了,但有一个更好的解决方案可以处理未知数量的结果。
SELECT student_name,
GROUP_CONCAT(DISTINCT test_score
ORDER BY test_score DESC SEPARATOR ' ')
FROM student
GROUP BY student_name;