2017-04-19 80 views
0

我從數據庫中提取名稱列表;mySQL - 忽略字段字符串中的字符

SELECT * FROM people ORDER BY name ASC 

但是一些名字就像,而這些都是在列表的末尾,而不是按字母順序排列,因爲[

開始是有一個簡單的方法忽略[mod]部分時,我的名字排序,但仍然拉入口?所以我還有約翰在我的名單中?

拉我後需要使用PHP對它們進行排序嗎?在LIKE開始刪除%:

SELECT * FROM people WHERE name NOT LIKE '[mod]%'; 

編輯:如果您正試圖排除以「[MOD]」的名字 -

+0

它看起來像你所說的「[ mod]'以表明用戶是主持人這就是你最終陷入這種情況的原因。如果mod是一個屬性指示符,最好爲它創建一個不同的字段。 – nonybrighto

回答

1
SELECT *, replace(name,'[mod]','') as sortname FROM people order by sortname ASC 

(請檢查語法),但本質上使用的替換功能

0

你可以做到這樣 - 使用NOT LIKE

+0

比較'not like'和''[mod]%'',所以在一個值中間的'[mod]'(例如:'Word [mod] in a sentence')不會被意外排除。 – Dygnus

+0

公平聲明..編輯 – Zak

+0

謝謝你的幫助,我對沒有正確解釋自己的道歉表示歉意 – user961882

1

用空字符串替換[國防部]標籤:

ORDER BY REPLACE(name, '[Mod]', '') 
0

您沒有提及當前你所使用的排序規則。你也忘了解釋你想如何排序 - 你想按照'[mod]'不在那裏排序的結果嗎?或者根據ASCII表中的字符順序?

'['字符(0x5B)出現在ASCII中的小寫字母之前,但是在大寫字母后面。因此,要挑選基於所述ASCII字符代碼:

1)使用區分大小寫的排序

2)排序`低級(名稱)ASC

3)ORDER BY名LIKE「[MOD] %」 DESC,名字ASC

如果你只是想忽略它的排序目的:

ORDER BY REPLACE(名字, '[MOD]', '')ASC

0

我會使用MySQL SUBSTRING_INDEX功能。例如

ORDER BY SUBSTRING_INDEX(name,']',-1) 

那將會在字符串的結尾開始,向後尋找,直到找到分隔符,在這個例子中,一個右括號。當它找到分隔符時,它將返回到目前爲止的所有內容,直到(或返回)分隔符。如果未找到分隔符,則返回整個字符串。

在將它包含在ORDER BY中之前,我們可以在SELECT列表中測試表達式,以更好地觀察行爲。

作爲示範:

SELECT t.name 
    , SUBSTRING_INDEX(t.name,']',-1) AS x_mod 
    FROM (SELECT '[mod]john' AS name 
     UNION ALL SELECT 'james' 
     UNION ALL SELECT 'jude' 
     ) t 
ORDER BY 2 

回報

name  x_mod 
--------- -------- 
james  james 
[mod]john john  
jude  jude  
0

用途:

SELECT * FROM people ORDER by REPLACE(name, '[mod]', ''); 

(這部作品在MySQL的)