鉴于下表:
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字段?
答案 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
操作,可以考虑使用以下两种方法:
sortingOrder
答案 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