2016-12-29 27 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