Mysql / php按varchar的第二个字排序

时间:2018-02-28 20:21:49

标签: php mysql sql word

我在mysql数据库中有一个VARCHAR(名字带有名字和姓氏,例如:John Snow)。我想按姓氏排序(按字母顺序排列)。

我可以在SQL请求中添加“ORDER BY SECOND WORD”之类的内容吗?

谢谢

4 个答案:

答案 0 :(得分:1)

不确定。一种方法是:

order by substring_index(name, ' ', -1)

请注意,这可能不适用于后缀。它也可能不适用于中间名。另一方面,标题可能会抛弃确切的第二个单词匹配,但这将适用于那些。

答案 1 :(得分:0)

如果保证firstname和lastname之间有一个空格,您可以执行类似

的操作
select 
[fullname]
, SUBSTRING_INDEX(fullname, ' ', 1) as [firstname]
, SUBSTRING_INDEX(fullname, ' ', -1) as [lastname]
from <table>
order by [lastname]

填写正确的表格和列名称。

答案 2 :(得分:0)

正如其他人已经提到的那样,您可以使用ORDER BY SECOND WORD函数在第一个空格后使用零件对结果进行排序。

在您的情况下,ORDER BY substring_index(name, ' ', -1)会转换为FIRST_NAME<space>LAST_NAME

但我不会那样做因为:

  1. 它不可靠,因为在现实生活中,您无法保证数据集中的所有名称都遵循a = 'One house in the middle of three woods' s = a.split() o = [] for word in s: try: o += [str(w2n.word_to_number(word))] except ValueError: o += [word] print(' '.join(o)) output:: '1 house in the middle of 3 woods' 格式。
  2. 根据您的数据集大小,它可能会非常慢。
  3. 如果你可以改变数据库的模式,那么对于名字和姓氏(可能是中间名),最好有两个单独的列。这将处理#1,因为您可以保证对姓氏而不是中间名进行排序。要解决#2,您始终可以在姓氏列上创建B树索引以加快排序速度。

答案 3 :(得分:0)

该问题专门要求按“第二个单词”进行排序。给出的某些答案按最后一个单词而不是第二个单词排序。要按“全名”字段的第二个单词排序,请使用以下...

ORDER BY SUBSTRING_INDEX(SUBSTRING_INDEX(fullname, ' ', 2), ' ', -1)

更笼统地说,要从包含由定界符DELIM分隔的值的字符串VALUES中选择第N个值,请使用以下代码...

SUBSTRING_INDEX( SUBSTRING_INDEX( VALUES, DELIM, N ), DELIM, -1 )

有关更多信息,请参阅https://www.giannistsakiris.com/2015/01/23/mysql-select-the-n-th-element-from-a-delimiter-separated-value-set/