【问题标题】:Let field value set sort order direction in Mysql让字段值在Mysql中设置排序方向
【发布时间】:2016-12-29 14:56:03
【问题描述】:

给定下表:

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 包含什么?它是否碰巧包含多个值(逗号分隔),也许?如果是这样,请不要在一个字段中存储多个值。使用链接表并“规范化”您的数据库。
  • @Mr47 FieldOrder 的值始终相同。底层数据被分组。每组记录都有自己的排序顺序。但是一次只查询一个组。这个例子只是一个非常简化的版本。
  • @Nebu:如果一次只查询“group”,那么这个表结构是不正确的。您真正想要的是一个表,其中每个组有多行,每行包含一个值。然后,您只需查询 gor 标识符并根据需要进行排序。

标签: mysql sql select sql-order-by


【解决方案1】:

解决此问题的一种方法是将FieldValue 分别视为“asc”和“desc”的FieldOrder 值的正数或负数。这可以用case 表达式来表达:

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

【讨论】:

  • 当你确定它时我没有注意到 fieldorder 列 :) +1
  • 这适用于数值。能否也提供字母值的解决方案?
【解决方案2】:

我不知道...

请注意,每一行都有一个FieldOrder,因此您寻求实现的目标似乎是有问题的。如果一行显示asc 而另一行显示desc 怎么办?那么这两行的顺序应该怎么显示呢?

如果要对order by动作进行参数化,可以考虑使用以下两种方法:

  1. 使用带有参数的存储过程,例如, sortingOrder
  2. 使用编程语言(例如 Java)构造查询字符串并 动态注入排序顺序,并且 然后执行查询字符串到 MySQL

【讨论】:

    【解决方案3】:

    您需要规范化数据并将其存储在更好的架构中。不要在单个字段中存储多个值,每行只存储一个值。您可以做的是将多个数据存储在自己的表中,其中每条数据都在自己的行中。

    尝试这样的架构:

    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
    

    【讨论】:

      猜你喜欢
      • 2014-01-25
      • 2012-07-06
      • 2015-06-21
      • 2013-05-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-10
      相关资源
      最近更新 更多