Mysql 最后排序为空
希望最后对null和空格进行排序,并已阅读order by列中使用Coalesce函数或If的所有解决方案 我的问题对我来说不属于这些工作,因为我正在排序的列是由创建查询的PHP脚本动态指定的,我的一些列位于联接中的两个表中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
$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