Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/68.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 最后排序为空_Mysql_Null_Sql Order By - Fatal编程技术网

Mysql 最后排序为空

Mysql 最后排序为空,mysql,null,sql-order-by,Mysql,Null,Sql Order By,希望最后对null和空格进行排序,并已阅读order by列中使用Coalesce函数或If的所有解决方案 我的问题对我来说不属于这些工作,因为我正在排序的列是由创建查询的PHP脚本动态指定的,我的一些列位于联接中的两个表中 $sortcol="boat"; $sql= "SELECT fleet,b.boat as boat,owner FROM boats as b LEFT JOIN owners as o ON b.boat=o.boat ORDER BY

希望最后对null和空格进行排序,并已阅读order by列中使用Coalesce函数或If的所有解决方案

我的问题对我来说不属于这些工作,因为我正在排序的列是由创建查询的PHP脚本动态指定的,我的一些列位于联接中的两个表中

   $sortcol="boat";
   $sql= "SELECT fleet,b.boat as boat,owner FROM boats as b 
   LEFT JOIN owners as o ON  b.boat=o.boat 
   ORDER BY $sortcol";
这很好用,我可以更改变量$sortcol,我的输出列表也很好用,除了上面的空和空

根据其他帖子,我尝试了这个

   $sortcol="boat";
   $sql= "SELECT fleet,b.boat as boat,owner FROM boats as b 
   LEFT JOIN owners as o ON  b.boat=o.boat 
   ORDER BY IF($sortcol is NULL,1,0), $sortcol";
这会抛出错误“列boat in ORDER BY子句不明确”。很明显,它想要b船,但由于一些原因,我不想进去,这是有问题的。 似乎每当我尝试在orderby子句中使用函数时,都不能使用列别名


如果您有两个相似的列名,那么您必须按照的顺序指定表。就这么简单

您应该能够在
选择
中使用不同的别名,以消除
列中的歧义,然后在

$sortcol = "bboat";
$sql= "
  SELECT 
    fleet,
    /* Alias as bboat to disambiguate from b.boat and o.boat
    b.boat as bboat,
    owner 
  FROM 
    boats as b
    LEFT JOIN owners as o ON  b.boat=o.boat 
  ORDER BY IF($sortcol is NULL,1,0), $sortcol";

注意:如果
$sortcol
是任何类型的用户输入的结果,则有必要将其与可接受列名的白名单进行比较,以防止SQL注入。

您是对的。我无法理解的原因是,MySQL接受一个模棱两可的
orderby
,只要您提供的名称没有以任何方式处理(我想不出任何方式。可能还有其他名称)

一旦出现这种情况,模糊性就会被拒绝

这是可以接受的(并且是多余的):

虽然
合并(名称“”)
名称为NULL
名称或NULL
均被拒绝

显而易见的解决方案是为别名使用不同的名称,这两个表中都没有

另一种可能是创建嵌套查询:

SELECT * FROM ( your query here, without ORDER ) AS original
ORDER BY IF($sortcol is NULL,1,0), $sortcol;
即:

$sortcol="boat";
$sql = <<<SQL
   SELECT * FROM (
      SELECT fleet,b.boat as boat,owner FROM boats as b 
         LEFT JOIN owners as o ON  b.boat=o.boat 
   ) AS original
   ORDER BY IF($sortcol is NULL,1,0), $sortcol;
SQL;
$sortcol=“船”;

$sql=根据ANSI sql,如果在
ORDER BY
子句中使用,则列别名只能由它们自己使用-不能使用别名投影其他列或表达式

因此,当在order by列表中使用
name
而不在表达式中时,它会被解释为对别名的引用。一旦在表达式中使用,它就无法解析为别名,因此MySQL会尝试查找一列来解析它。在查询的作用域中有两个这样的列,因此会出现关于歧义的错误

此解析行为可以从以下内容中看到(在MySQL和SQL Server中测试)


退货(按别名排序)


返回(按基列排序)


有趣的是,你是说如果我用b.boat作为boatname而不是b.boat作为boat,它会工作吗???是的,没错。除非您有另一个名为
boatname
:-)@MartinSmith的字段,谢谢您的链接。对你的答案投赞成票——这对我当然有用。
$sortcol="boat";
$sql = <<<SQL
   SELECT * FROM (
      SELECT fleet,b.boat as boat,owner FROM boats as b 
         LEFT JOIN owners as o ON  b.boat=o.boat 
   ) AS original
   ORDER BY IF($sortcol is NULL,1,0), $sortcol;
SQL;
CREATE TABLE T
(
C INT,
D INT
)

INSERT INTO T
SELECT 1, 2 UNION ALL
SELECT 2, 1
SELECT C AS D, D AS C
FROM T 
ORDER BY D
D           C
----------- -----------
1           2
2           1
SELECT C AS D, D AS C
FROM T 
ORDER BY D + 0
D           C
----------- -----------
2           1
1           2