2016-12-29 94 views
1

假设表格如下:让字段的值设置排序方向在MySQL

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字段进行引用?

+1

问题不够明确。请添加一些示例以显示您想要实现的目标。 – GurV

+3

如果表格有两条记录,这将如何工作;一个说它应该是上升的,一个说是下降的?请举例... – Mr47

+0

是什么'FieldValue'包含哪些内容?它碰巧包含多个值(逗号分隔),也许?如果是这样,请不*在一个字段中存储多个值。使用链接表并“规范化”你的数据库。 –

回答

2

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

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

我在钉钉子时没有注意到fieldorder列+1 :) +1 – e4c5

+0

这对数值很有用。你还可以提供字母值的解决方案吗? – Nebu

1

不,我知道的...

请注意,每行都有一个FieldOrder所以你寻求实现什么似乎是有问题的。如果一个行说asc和什么其他行说desc?那么如何显示两行的顺序呢?

如果你想拥有参数order by操作,可以考虑使用以下两种方法:

  1. 使用一个存储过程,需要,比如说一个参数, sortingOrder
  2. 使用一种编程语言(例如Java)来构造一个查询字符串并动态地注入排序顺序,然后 执行查询字符串到MySQL
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