2012-03-21 19 views
0

我有一個MySQL表,有一個逗號分隔值的字段。我如何獲得最大價值?如何在MySQL中的逗號分隔字段中獲取最大值?

例子:

CREATE TABLE `test`.`scale` (`scale` VARCHAR(500)); 

INSERT INTO `test`.scale 
VALUES 
('1,5,0.3,0.8,1'), 
('0.5,0.7,0.1,0.3'), 
('7,0.5,0.7,4'); 

規模:

1,5,0.3,0.8,1 
0.5,0.7,0.1,0.3 
7,0.5,0.7,4 

答案:

5 
0.7 
7 

如何選擇在這個字符串中的最大值?

不幸的是,我不能改變以前的人執行逗號分隔解決方案的方式。我希望有一個MySQL函數可以幫助我,否則我將不得不做一些凌亂的PHP東西。

+5

請勿以此方式存儲值:http://gtowey.blogspot.com/2009/12/how-to-fix-comma-separated-list-of-doom.html – TehShrike 2012-03-21 17:56:02

+0

感謝您回覆我。不,它不是基於行的。我將用測試創建語句更新問題 – richie 2012-03-21 18:00:39

回答

2

我不相信SQL有分裂字符串的功能。 Here's some code that claims to do it,但我沒有測試過它。

更深層的原因是SQL絕望地希望你存儲你的數據在normalized form。在這種特殊情況下,這意味着每個字段都應該代表一行有關該主題的單個數據片段。

本質上你會在兩個獨立的表中存儲scaleanswer,你可以使用每個人所屬問題的ID來相互匹配。規模將不得不每縮放比例選項一行,每規模不一行:

OPTIONS      ANSWERS 
question | scaleoption  question | answer 
---------|------------  ---------|------- 
     1 | 1.5     1 | 5 
     1 | .3      2 | .7 
     1 | .8    ... 
     1 | 1 
     2 | .5 
     2 | .7 
... 

然後,您可以使用查詢select max(scaleoption) from options where question = 2以獲取問題2.最大的選擇這種格式也可以讓你做這樣的事情找到所有問題的地方其中一個選項是1,或者計算特定問題有多少個選項。它看起來更復雜,但是它是一種靈活的,可擴展的,可移植的做事方式。

如果你想使用你當前的格式,你必須返回整個字符串並用其他編程語言分解它。

+0

MySQL沒有功能來拆分字符串。其他DBMS(例如PostgreSQL)確實有這種能力,可以將逗號分隔的列表變成「表」 – 2012-03-21 18:06:09

+0

謝謝,我擔心這將是唯一的解決方案。 – richie 2012-03-21 18:07:25

+0

@a_horse_with_no_name謝謝,這對我們很有幫助! – octern 2012-03-21 21:19:03

0

創建光標withiin一個過程來獲取每一行並插入到一個新表中,使用嵌套的substring_index分隔每個逗號分隔的字段,然後從這個新表中選擇max,使用光標設置一個循環來重複這個操作來整個表和存儲新表格中每行的最大值,並在最後選擇*表格。

相關問題