0

我们正在从数据库中选择一些字段(包括左连接),并设法使用以下命令按包含 INT 的字段对它们进行排序:

ORDER BY FIELD (t.type, '1','2','4','5','3') 

这是它们出现的顺序,但是我们也有不包含整数的条目,它们将重新调整为 NULL。这很好,但我们似乎无法将 NULL 条目放在我们想要的位置。

我们希望它们在列表中排在第二位,例如:

ORDER BY FIELD (t.type, '1','NULL','2','4','5','3') 

或者

ORDER BY FIELD (t.type, '1','0','2','4','5','3') 

ETC...

我们如何实现这一点并将具有 NULL t.type 字段的条目放在列表中的第二位?

自发布此消息以来,我一直在搜索高低,但找不到有关该主题的任何内容。

任何帮助是极大的赞赏。

更新:

这是我们正在使用的完整选择语句:

select d.url, d.lid, d.title, d.description, d.date, d.hits, d.downloadratingsummary, d.totalvotes, d.totalcomments, d.filesize, d.version, d.homepage, d.ns_compat, d.ns_des_img, t.type from downloads_downloads d LEFT JOIN downloads_type t on d.lid = t.lid where cid=96 ORDER BY FIELD (t.type, 1,12,2,4,5,3), d.date DESC LIMIT 0,20
4

4 回答 4

6

是否有一个值可以代替其他地方没有出现的 NULL?就像是:

ORDER BY FIELD(coalesce(t.type, -1), '1', '-1', '2', '4', '5', '3') 

顺便说一句,参数也可以是数字而不是字符串:

ORDER BY FIELD(coalesce(t.type, -1), 1, -1, 2, 4, 5, 3) 
于 2013-06-27T13:52:46.357 回答
0

删除周围的引号NULL。它不是一个字符串。实际上,也请删除数字周围的引号。在那种情况下,它们可能不会受到伤害,但它们也不是字符串。

如果这不起作用,我不确定如何正确处理它。FIELD()的MySQL 文档说:

如果 str 为 NULL,则返回值为 0,因为 NULL 无法与任何值进行相等比较。

因此,正如您在第三个示例中所尝试的那样,您可能必须使用 0,但也许删除引号会解决它。

于 2013-06-27T13:34:40.060 回答
0

为什么不在您的 SELECT 语句中执行此操作,例如 SELECT IFNULL(t.type, 2) FROM table_name t

在这里,您将 2 的值分配给任何 NULL 值。这对你有用吗?

于 2013-06-27T13:49:32.827 回答
0

尝试这个

 ORDER BY CASE `t.type` 
            WHEN '1' THEN 1
            WHEN '2' THEN 2
            WHEN '4' THEN 3
            WHEN '5' THEN 4
            WHEN '3' THEN 5
            WHEN null THEN 6
         END
于 2013-06-27T13:51:44.927 回答