MySQL按值排序列

时间:2015-09-22 09:50:00

标签: mysql

我想根据列值对数据库结果进行排序。我以为我需要这样做:

SELECT * FROM products
ORDER BY FIELD(brand_id, 4, 1, 6)

但这根本不能对我的结果进行排序。或者至少以某种我不理解的方式。

我想要实现的是我获得所有产品,按brand_id排序。首先是brand_id 4,然后是1然后是6,然后是其余的。

以下是jsfiddle上的示例。

如果不能正常工作(jsfiddle在这里工作不正常),请参阅下面的代码:

架构:

CREATE TABLE `products` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `brand_id` int(10) unsigned NOT NULL,
  `price` decimal(8,2) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB;

INSERT INTO `products` (`id`, `brand_id`, `price`)
VALUES
    (1, 1, 10.32),
    (2, 4, 15.32),
    (3, 2, 23.32),
    (4, 6, 56.32),
    (5, 4, 23.32),
    (6, 4, 23.32),
    (7, 1, 25.32),
    (8, 5, 15.32),
    (9, 3, 55.32),
    (10, 5, 23.32);

2 个答案:

答案 0 :(得分:2)

问题在于:

 FIELD(brand_id, 4, 1, 6)
如果列表中不存在brand_id

将返回0,因此不存在的品牌将位于顶部。你可以用这个:

ORDER BY FIELD(brand_id, 6, 1, 4) DESC

所有值的顺序相反,然后你必须按DESC顺序排序。

答案 1 :(得分:1)

通常,当您使用field()进行排序时,您还有in

SELECT p.*
FROM products p
WHERE brand_id IN (4, 1, 6)
ORDER BY FIELD(brand_id, 4, 1, 6);

然后它就像宣传的那样工作。

您可以采取更明确的方法,而不是颠倒值:

SELECT p.*
FROM products p
ORDER BY brand_id IN (4, 1, 6) DESC,
         FIELD(brand_id, 4, 1, 6);

这个更长,但意图很明确。