Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL:按两列混合排序,不基于优先级_Sql_Mysql - Fatal编程技术网

SQL:按两列混合排序,不基于优先级

SQL:按两列混合排序,不基于优先级,sql,mysql,Sql,Mysql,我正在使用mySQL。我必须按姓氏排列联系人姓名,但如果没有姓氏,我就按姓氏排列 这看起来像: ORDER BY lastname = "", lastname, firstname 但是,这会使具有姓氏的出现在顶部。我喜欢的行为是混合名字和姓氏,就像它们来自同一个领域一样 示例(假设这些是名称): 与: A A,T B C Z,G 谢谢尝试使用 注意:这要求您不要使用空字符串(即“”)存储空姓氏。 ORDER BY Coalesce(LastName, FirstName) 按照评论中的

我正在使用mySQL。我必须按姓氏排列联系人姓名,但如果没有姓氏,我就按姓氏排列

这看起来像:

ORDER BY lastname = "", lastname, firstname
但是,这会使具有姓氏的出现在顶部。我喜欢的行为是混合名字和姓氏,就像它们来自同一个领域一样

示例(假设这些是名称):

与:

A
A,T
B
C
Z,G
谢谢

尝试使用
注意:这要求您不要使用空字符串(即“”)存储空姓氏。

ORDER BY Coalesce(LastName, FirstName)
按照评论中的建议,通过再次将FirstName添加到orderby列表中,您将正确地为两个姓氏相同的人排序。这里有一个例子

ORDER BY Coalesce(LastName, FirstName), FirstName

orderby
支持自定义排序。但考虑到您的逻辑,我建议您使用
CONCAT
SELECT
中创建一个字段,然后对其进行排序

SELECT *, IF(LENGTH(lastname) = 0, firstname, CONCAT(lastname, ', ', firstname)) AS fullname
FROM contacts
ORDER BY fullname;
这还有一个好处,就是根据相同的排序逻辑在结果中返回
fullname

ORDER BY
CASE  
  WHEN LName is null
  THEN FName 
  ELSE LName
  END 
更多使用和:


…然后再次添加Firstname,这样两个姓氏相同的联系人将被正确排序。我刚刚尝试了这一点,现在联系人看起来几乎是随机排序的。在合并之前,它肯定更有条理……我根据阿克塞尔的建议尝试了一下,它看起来和按姓氏、姓氏排序的顺序一样。我在查询中连接了几个表,如果这有关系的话。@Tyler我刚刚在一个示例表上运行了它,它按预期工作了吗?所以我对你之前的陈述感到非常困惑。@Tyler这篇专栏有一个简单的方法
updateyourtable set lastname=null,其中lastname=''
注意,将数据输入数据库的任何内容都需要更新。lastname值是null还是长度为零的字符串?这没有给出所需的结果。可能是因为我用“”代替null.+1,尽管我不同意在姓氏列中使用空字符串。我同意你的解决方案对OP的问题有效这就是问题所在!!对第一个解决方案进行了很好的调整,因此它可以在空字段上工作。+1很好的解决方案…我甚至没有想到…但我仍然不同意空字符串值。@John Hartsock-这取决于数据库设计和商店惯例。我同意,一般来说,我希望像贝利这样的人的姓氏为“”(已知为空),办公空间中鲍勃的姓氏为空(未知,但假设可能存在)。但是,在这种情况下,我认为所需的排序行为没有区别。
ORDER BY
CASE  
  WHEN LName is null
  THEN FName 
  ELSE LName
  END 
ORDER BY COALESCE(NULLIF(LastName, ''), FirstName), FirstName