让字段值在Mysql

时间:2016-12-29 14:56:04

标签: 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;

我想运行一个查询,根据FieldOrder字段中的值对FieldValue字段进行排序。 E.g。

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

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

3 个答案:

答案 0 :(得分:2)

解决此问题的一种方法是将FieldValue视为&{34; asc"的FieldOrder值的正面或负面。和" desc"分别。这可以用case表达式表示:

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

答案 1 :(得分:1)

不是我知道......

请注意,每一行都有一个FieldOrder,所以你想要达到的目标似乎值得怀疑。如果一行显示asc而另一行说desc怎么办?那么如何显示两行的顺序呢?

如果您想要参数化order by操作,可以考虑使用以下两种方法:

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

答案 2 :(得分:0)

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

尝试这样的架构:

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
相关问题