我有一个产品表,其结构如下。
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
从这个结果我只需要选择第一条记录。
我希望我明白我的观点
任何帮助将不胜感激
答案 0 :(得分:1)
Select * from product order by
ISNULL(PRODUCTNAME),FIELD(producttype,3,2,4,1);
答案 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)