2010-06-25 68 views
0

我有MySQL中的表,看起來大致是:將count排在MySQL

value | count 
------------- 
Fred | 7 
FRED | 1 
Roger | 3 
roger | 1 

也就是說,它是與MySQL之外串OPS創建,因此它們的值是大小寫和後延空格敏感。

我希望它看起來像:

value | count 
------------- 
Fred | 8 
Roger | 4 

也就是說,由MySQL管理,與value主鍵。哪一個(「Fred」或「FRED」)保存並不重要。

我知道如何在代碼中做到這一點。我也知道如何生成問題值列表(使用自連接)。但我想拿出一個SQL更新/刪除來遷移我的表,我想不出任何東西。如果我知道沒有一對記錄具有一個值的變體,具有相同的計數(例如(「Fred」,4)和(「FRED」,4)),那麼我認爲我可以用自加入以複製計數,然後進行更新以刪除零。但我沒有這樣的保證。

有沒有簡單的我想念的東西,還是這種情況下,你只是在數據庫外寫一個簡短的函數?

謝謝!

+0

你應該在插入之前正常化你的字符串,你會爲自己節省了很多麻煩 – mcabral 2010-06-25 23:15:08

+0

mcabral:總的來說,我同意,但在我的實際數據的情況下,目前還不清楚是什麼「標準化「的意思。 – Ken 2010-06-25 23:33:43

回答

1

奇怪的是,MySQL似乎爲你做了這個。我只是在MySQL 5.1.47測試了這個:

create table c (value varchar(10), count int); 
insert into c values ('Fred',7), ('FRED',1), ('Roger',3), ('roger',1); 

select * from c; 

+-------+-------+ 
| value | count | 
+-------+-------+ 
| Fred |  7 | 
| FRED |  1 | 
| Roger |  3 | 
| roger |  1 | 
+-------+-------+ 

select value, sum(count) from c group by value; 

+-------+------------+ 
| value | sum(count) | 
+-------+------------+ 
| Fred |   8 | 
| Roger |   4 | 
+-------+------------+ 

我很驚訝地看到MySQL的轉換串那樣,我不知道我能解釋爲什麼這樣做。我期望必須得到四個不同的行,並且必須使用一些字符串函數將值映射到規範形式。

+0

它不會更改名稱,您的GROUP BY子句僅將第一次出現用作結果集中的值;這兩個都是名字大小寫。 – JYelton 2010-06-25 23:19:51

+0

您是否嘗試過使用不同數量的尾隨空格? – mcabral 2010-06-25 23:21:20

+0

@mcabral:這應該只關係如果數據類型是CHAR – 2010-06-25 23:25:01

2

至於如何獲得你正在尋找單獨的SQL查詢結果的例子:

SELECT UPPER(value) AS name, SUM(count) AS qty FROM table GROUP BY name; 

如果你犯了一個新表來保存正確的價值觀,你插入上面的查詢來填充新的表像這樣:

INSERT INTO newtable (SELECT UPPER(value) AS name, SUM(count) AS qty FROM table GROUP BY name);