Mysql select-where-ORDERBY子句(用于Prestashop)

Mysql select-where-ORDERBY子句(用于Prestashop),mysql,select,conditional,where,prestashop,Mysql,Select,Conditional,Where,Prestashop,对于那些熟悉Prestashop的人,我尝试在category视图中添加一个额外的排序顺序选项。更具体地说,我想为选择的功能添加额外的排序顺序 这是获取产品的prestashop查询的主要部分:(选择部分中的最后一列以及我添加的最后一个连接) 表ps\u feature\u product如下所示: CREATE TABLE IF NOT EXISTS `ps_feature_product` ( `id_feature` int(10) unsigned NOT NULL, `id_p

对于那些熟悉Prestashop的人,我尝试在category视图中添加一个额外的排序顺序选项。更具体地说,我想为选择的功能添加额外的排序顺序

这是获取产品的prestashop查询的主要部分:(选择部分中的最后一列以及我添加的最后一个连接)

ps\u feature\u product
如下所示:

CREATE TABLE IF NOT EXISTS `ps_feature_product` (
  `id_feature` int(10) unsigned NOT NULL,
  `id_product` int(10) unsigned NOT NULL,
  `id_feature_value` int(10) unsigned NOT NULL,
  PRIMARY KEY (`id_feature`,`id_product`,`id_feature_value`),
  KEY `id_feature_value` (`id_feature_value`),
  KEY `id_product` (`id_product`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
该表包含许多不同的产品功能,但我需要具有
id\u feature\u value
4到13的功能,并且该id也可以用作排序顺序。 到目前为止,没有问题,一个简单的WHERE子句起到了关键作用:

WHERE fp.`id_feature_value` BETWEEN 4 AND 13 
订单条款也是直截了当的:

ORDER BY fp.`id_feature_value` ASC
但现在有点棘手。 对于未设置范围为4-13的
id\u feature\u value
的产品,也应将其合并,但应将其排序到列表的末尾

这是我无法理解的最后一点疑问。
如何选择某个范围内的要素,同时选择不在该范围内的要素并添加排序顺序。

这不包括它们吗

WHERE fp.`id_feature_value` BETWEEN 4 AND 13
   OR fp.`id_feature_value` IS NULL
编辑:对不起,我误解了你所说的“没有……设置”的意思

我想您应该在
SELECT
列表中添加一些内容,以便进行排序,如

IF(fp.`id_feature_value` BETWEEN 4 AND 13, 0, 1) AS my_sort
然后将
my_sort ASC
包含在您的排序中

简化示例:

mysql> create table so1 (n integer);
Query OK, 0 rows affected (0.11 sec)

mysql> insert into so1 values (1),(2),(3),(4),(5),(NULL);
Query OK, 6 rows affected (0.02 sec)
Records: 6  Duplicates: 0  Warnings: 0

mysql> select n, if(n between 2 and 4, 0, 1) AS s from so1 order by s ASC, n;
+------+---+
| n    | s |
+------+---+
|    2 | 0 |
|    3 | 0 |
|    4 | 0 |
| NULL | 1 |
|    1 | 1 |
|    5 | 1 |
+------+---+
6 rows in set (0.00 sec)

以下是我在评论中所说的: 它会自动为您提供所需的结果:首先是4-13,然后在列表末尾显示非4-13

SELECT
<<query details>>
WHERE fp.`id_feature_value` BETWEEN 4 AND 13 
ORDER BY fp.`id_feature_value` ASC
UNION
SELECT
<<query details>>
WHERE fp.`id_feature_value` NOT BETWEEN 4 AND 13 
ORDER BY fp.`id_feature_value` ASC
选择
其中fp.`id_特征_值`4和13之间
按fp.`id\U特征值`ASC排序
联合
挑选
其中fp.`id_feature_value`不在4和13之间
按fp.`id\U特征值`ASC排序

听起来是工会的理想案例。选择范围内的功能和范围外的功能。我不确定联合如何解决我的问题,但可能我忽略了一些东西。也许我只是对所有的结合的可能性了解得不够。不,那是行不通的。不太可能为任何产品设置任何特征值。如果我可以将类似或(fp.
id\u feature\u value
介于4和13之间)的值设置为空,我想这就是解决方案。对不起,@Mattie-oops。我误解了这个问题。更新。谢谢Rob,但我认为在本例中,IF将
my_sort
的值设置为0或1?我需要保留
id\u feature\u value
的实际值,因为这将决定排序顺序。其思想是首先按0/1排序,对结果进行分区,然后按实际值进行子排序。或者,如果您明确不希望对“non-between”分区进行排序,请将排序键设置为类似
if(n介于2和4之间,n,100)
并且不要再以Chris为例对sortThanks进行细分。我想我必须更深入地研究联盟。
SELECT
<<query details>>
WHERE fp.`id_feature_value` BETWEEN 4 AND 13 
ORDER BY fp.`id_feature_value` ASC
UNION
SELECT
<<query details>>
WHERE fp.`id_feature_value` NOT BETWEEN 4 AND 13 
ORDER BY fp.`id_feature_value` ASC