2016-08-05 71 views
1

的時候我有這樣MYSQL取消選擇行具有相同的第一個字符

| symbol | value | 
------------------- 
| test | 12 | 
| yes  | 8  | 
| test.m | 13 | 
| no  | 10 | 
| nah.m | 20 | 
| nah  | 17 | 

表我想要的結果,這樣的

| symbol | value | 
------------------- 
| test | 13 | 
| yes  | 8  | 
| no  | 10 | 
| nah  | 20 | 

,如果你看到表,我想選擇記錄中當記錄有最後一個字符中沒有「.m」的記錄時,在最後一個字符中有「.m」,並刪除「.m」。

任何人都可以幫助我嗎?提前致謝。

+0

,並與值12的測試案例和組..? – scaisEdge

+0

@scaisEdge no,對於「test.m」值的測試 –

回答

1

您可以使用

select 
    case when locate('.', symbol)> 0 
       then sustr(symbol, 1, locate('.', symbol) -1) 
       else symbol 
     end as my_symbol, 
    max(value) 
from my_table 
group by my_symbol 
+0

「.m」的'value'必須總是大於沒有'.m'的值? – mnv

+0

我已經使用max來選擇最大的..就像在你的示例中..你可以使用你喜歡的聚合函數。 – scaisEdge

+0

我說我們有兩個記錄的情況:test:12和test.m:11。在你的情況將是11而不是12. – mnv

2
select t1.symbol, coalesce(t2.value, t1.value) 
from t t1 
left join t t2 on t1.symbol = concat(t2.symbol, '.m') 
where t1.symbol not like '%.m' 
+0

很好的答案。它應該總是't1.symbol'。並且可以使用'coalesce'來簡化案例表達式。因此:'從...中選擇t1.symbol,coalesce(t2.value,t1.value)。 –

+0

謝謝。編輯。 – mnv

+0

對不起隊友,它仍然顯示第一個,而不是「.m」值 –