MYSQL按案例排序

时间:2013-07-22 07:07:30

标签: mysql sql sql-order-by

我有一个产品表,其结构如下。

   ProductID     ProductName     ProductType
   1             Irrigation      1  
   2             Landscape       2  
   3             Sleeving        3  
   4             Planting        4  

现在我需要按产品类型3,2,4,1的顺序返回行 为此,我使用了MYSQL FIELD方法,它可以正常工作

   Select * from product order by FIELD(producttype,3,2,4,1)

这很好用,

我的问题是,如果productname为producttype为空,那么它应该采用下一个非空的productname,所以在这种情况下,结果顺序应该是2,4,1,3。

因此,第一个条件是记录需要按照产品类型的顺序进行

Sleeving      3
Landscape     2
Planting      4
Irrigation    1                

但是,如果producttype 3的Productname为空,那么订单需要

Landscape     2
Planting      4
Irrigation    1
              3

产品类型2的产品名称为空,那么订单需要

Planting      4
Irrigation    1
              3
              2

从这个结果我只需要选择第一条记录。

我希望我明白我的观点

任何帮助将不胜感激

5 个答案:

答案 0 :(得分:1)

Select * from product order by  
ISNULL(PRODUCTNAME),FIELD(producttype,3,2,4,1);

fiddle

答案 1 :(得分:0)

这将符合规范:

ORDER BY NULLIF(ProductName,'') IS NULL, FIELD(producttype,3,2,4,1)

如果ProductName是"空"第一个表达式将返回1 (NULL或零长度字符串'),否则返回0.

因此,这将首先排序所有非空的ProductName,然后是空的ProductName。

然后,它将按原始表达排序。

请注意,当有两个或更多(或全部)空ProductName时,此方法会保留最初指定的顺序。

("空"的测试可以扩展到包括其他情况,例如,使用TRIM()函数。


表达式

NULLIF(ProductName,'') IS NULL

是简写,它与SQL-92兼容:

CASE WHEN ProductName = '' OR ProductName IS NULL THEN 1 ELSE 0 END 

(还有其他方法可以获得相同的结果。)

答案 2 :(得分:0)

应该工作!

 SELECT * FROM product ORDER BY FIELD(IF(ProductName is null,0,producttype),1,3,2,5)

答案 3 :(得分:0)

这是一个非常复杂的查询,并且永远不会 [citation needed] 工作,因为它应该标识另一行中可以是任何内容的下一个值。可以使用视图,函数,旋转和许多连接,但作为行数,我不认为它可以给出结果。

但是,要直接回答,可以使用CASE订购BY

Select * from product order by 
   CASE WHEN productname IS NULL then FIELD(producttype, 2, 4, 1, 3)
   CASE WHEN productname IS NOT NULL THEN FIELD(producttype, 3, 2, 4, 1)

同样,这不是完整查询,也不是解决方案

如果您的行有限,您可以像这样链接您的查询

Select * from product order by 
   CASE WHEN productname IS NULL then FIELD(producttype, 2, 4, 1, 3)
   CASE WHEN (SELECT productname n FROM product WHERE producttype = '2') IS NULL THEN FIELD (4, 1, 3, 2)

如您所见,我已修复查询以搜索其中包含“2”作为产品类型的行。您可以通过进行另一个查询并将其转换为主查询来了解它们。

再一次不是必要的,处理行服务器端它会比这更容易。

答案 4 :(得分:-1)

你可以尝试这个

从产品中选择*,其中ProductName!=''按阶段排序(产品类型,3,2,4,1)