Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
让字段值设置Mysql中的排序顺序方向_Mysql_Sql_Select_Sql Order By - Fatal编程技术网

让字段值设置Mysql中的排序顺序方向

让字段值设置Mysql中的排序顺序方向,mysql,sql,select,sql-order-by,Mysql,Sql,Select,Sql Order By,鉴于下表: CREATE TABLE `example` ( `Identifier` int(11) NOT NULL AUTO_INCREMENT, `FieldValue` varchar(255) DEFAULT NULL, `FieldOrder` enum('asc','desc') DEFAULT 'asc', PRIMARY KEY (`Identifier`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; 我想运行一个查询,根据F

鉴于下表:

CREATE TABLE `example` (
  `Identifier` int(11) NOT NULL AUTO_INCREMENT,
  `FieldValue` varchar(255) DEFAULT NULL,
  `FieldOrder` enum('asc','desc') DEFAULT 'asc',
  PRIMARY KEY (`Identifier`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
我想运行一个查询,根据FieldOrder字段中的值对FieldValue字段进行排序。例如

Select * from example order by FieldValue [here should the FieldOrder value be placed]

是否可以在查询的排序部分引用FieldOrder字段?

一种方法是分别将
FieldValue
的值“asc”和“desc”视为正值或负值。这可以用
大小写
表达式表示:

SELECT   *
FROM     example
ORDER BY CASE FieldOrder WHEN 'asc' THEN 1 ELSE -1 END * FieldValue
据我所知

请注意,每一行都有一个
字段顺序
,因此您想要实现的目标似乎有问题。如果一行显示为
asc
,另一行显示为
desc
,该怎么办?那么,这两行的顺序应该如何显示呢

如果您想通过Actuple实现参数化<代码>订单,您可以考虑使用以下两种方法:

  • 使用接受参数的存储过程,例如,
    排序顺序
  • 使用编程语言(如Java)构造查询字符串并 动态注入排序顺序,并 然后将查询字符串执行到MySQL

  • 您需要规范化数据并将其存储在更好的模式中。不要在单个字段中存储多个值,每行仅存储一个值。您可以做的是将多个数据存储在自己的表中,其中每个数据段都位于自己的行中

    尝试以下模式:

    CREATE TABLE `example` (
      `Identifier` int(11) NOT NULL AUTO_INCREMENT,
      PRIMARY KEY (`Identifier`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
    
    CREATE TABLE `exampleData` (
      `RowID` int(11) NOT NULL AUTO_INCREMENT,
      `Identifier` int(11) NOT NULL,
      `FieldValue` varchar(255) DEFAULT NULL,
      PRIMARY KEY (`RowID`),
      INDEX `Identifier` (`Identifier`),
      FOREIGN KEY (Identifier) REFERENCES example(Identifier)
      ON DELETE CASCADE ON UPDATE CASCADE
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
    
    现在有了两个表,在
    exampleData
    表中,
    FieldValue
    中的每个数据段都有一行

    现在您可以这样查询:

    SELECT Identifier, FieldValue
    FROM example
    JOIN exampleData USING(Identifier)
    WHERE Identifier = 3
    ORDER BY FieldValue ASC
    

    这个问题不够清楚。请添加一些示例来说明您正试图实现的目标。如果表中有两条记录,这将如何工作;一个说应该上升,一个说下降?请提供示例,
    FieldValue
    包含哪些内容?它是否碰巧包含多个值(逗号分隔)?如果是,请不要在一个字段中存储多个值。使用链接表并“规范化”数据库。@Mr47 FieldOrder的值始终相同。基线数据已分组。每组记录都有自己的排序顺序。但是一次只查询一个组。这个例子只是一个非常简化的版本。@Nebu:如果一次只查询“组”,那么这个表结构是不正确的。您真正想要的是一个表,其中每个组有多行,每行包含一个值。然后您只需查询gor标识符并根据需要进行排序。当您确定字段顺序列时,我没有注意到它:)+1这对于数值非常有用。您还可以为字母值提供解决方案吗?