Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/57.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.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
MYSQL-按字母顺序对2列进行排序,如果第一列为空,则使用第二列_Mysql_Sorting - Fatal编程技术网

MYSQL-按字母顺序对2列进行排序,如果第一列为空,则使用第二列

MYSQL-按字母顺序对2列进行排序,如果第一列为空,则使用第二列,mysql,sorting,Mysql,Sorting,我试图对mysql数据库按字母顺序进行排序,其中company_name是主要排序,但如果没有company_name,则按last_name排序。我将在下面列出一个例子 公司名称:(主排序列) 1 ABC卡车运输 2 Genius加热 3 4个Xtreme窗口 姓氏:(第二栏) 1布莱恩特 2罗杰斯 3燧石 4刘易斯 排序如下: 1 ABC卡车运输 3燧石 2 Genius加热 4个Xtreme窗口 这是可能的,还是我应该将它们合并到一个数组中,并使用php对它们进行排序?只需使用大小写并按顺

我试图对mysql数据库按字母顺序进行排序,其中company_name是主要排序,但如果没有company_name,则按last_name排序。我将在下面列出一个例子

公司名称:(主排序列)
1 ABC卡车运输
2 Genius加热
3
4个Xtreme窗口

姓氏:(第二栏)
1布莱恩特
2罗杰斯
3燧石
4刘易斯

排序如下:
1 ABC卡车运输
3燧石
2 Genius加热
4个Xtreme窗口


这是可能的,还是我应该将它们合并到一个数组中,并使用php对它们进行排序?

只需使用大小写并按顺序选择一列作为“名称”。最好通过例子来说明

SELECT
CASE WHEN company_name IS NULL THEN last_name ELSE company_name END AS name
FROM mytable
ORDER BY name ASC
如果确实需要,也可以在ORDERBY子句中使用case语句。
我认为上述方法确实是解决您问题的更好方法,因为您甚至不再拥有php中的逻辑,但您可能不同意

SELECT company_name, last_name
FROM mytable
ORDER BY CASE WHEN company_name IS NULL THEN last_name ELSE company_name END ASC

编辑:我只假设
公司名称为空
适合您的情况。如果你需要在不同的条件下做这件事,那就是你自己的锻炼。它是空的吗?或者应该将其与”进行比较?

借用user606723的答案,但展示了在MySQL中如何更普遍地实现这一点,即使用
IFNULL()

IFNULL()返回第一个表达式,除非第一个表达式为null,否则它将返回第二个表达式。它是为这些类型的场景而设计的

SELECT
  IFNULL(company_name, last_name) AS name
FROM mytable
ORDER BY name
编辑

如果company_name保留空格而不是null,则可以执行以下操作:

SELECT
  IF(company_name <> '', company_name, last_name) AS name
FROM mytable
ORDER BY name
选择
如果(公司名称“”、公司名称、姓氏)作为名称
从mytable
点名
对于IF语句,如果第一个表达式的计算结果为true,则返回第二个表达式,否则返回第三个表达式

如果可能有NULL或blank,则这将起作用:

SELECT
  IF(company_name IS NOT NULL AND company_name <> '', company_name, last_name) AS name
FROM mytable
ORDER BY name
选择
如果(公司名称不为空,公司名称为“”、公司名称、姓氏)作为名称
从mytable
点名

您的示例和606723几乎都可以使用。我觉得我错过了一些小东西。输出如下所示。排序如下:1 ABC卡车2 Genius加热4个Xtreme窗口缺少只有姓氏的行。啊,那么它不是空的,它是空的。您可以使用IF语句来实现这一点。我现在正在更新答案。像这样的IF语句(或者它真的是一个函数)真的有什么好处吗?我觉得案例陈述更为普遍正确。老实说,我认为这是一种不好的做法,但也许我不知道什么。不过我确实有一个相关的问题。我需要在while语句中使用我的记录ID。现在唯一可用的数组标识符是$row[name]。我还需要$row[ID]。有什么想法吗?@user606723,如果说普遍正确,你的意思是SQL92,那么是的,我同意,CASE更普遍。我猜他们也会执行相同的操作。如果字段为空,我可以返回并使其为null,或者我可以将其计算为“”。现在这个字段不是空的,它是空的。这个条件就像在
where
子句中使用它一样
从tablename中选择*,其中company_name=''
,如果这得到所有行的公司名称都为空,那么您将希望使用
company_name=''
作为条件。