2015-10-13 54 views
2

我們如何設置結果的模式,以便選擇或保存在變量中。MYSQL order by - follow a pattern

所以基本上當我選擇數據時,它是按如下順序排列的。

customer ID    Email 
1       [email protected] 
2       [email protected] 
3       [email protected] 
4       [email protected] 

所以我想選擇表中的所有記錄!不過,我想訂購他們,使他們按照這個格式

customer ID    Email 
1       [email protected] 
2       [email protected] 
3       [email protected] 
4       [email protected] 
52      [email protected] 
7       [email protected] 
84      [email protected] 
99      [email protected] 
10      [email protected] 
11      [email protected] 
124      [email protected] 
1321      [email protected] 

那麼,怎樣才能設置我的查詢來獲取我的結果遵循類似的命令。我基本上想知道如何從我的數據庫中選擇(或處理一旦存儲的)數據以遵循特定模式。

編輯:

這是我努力的腳本,那麼部分工作,但數據不沾格局。

SELECT DISTINCT customer_id, email 
FROM customer_1_tbl 
WHERE customer_id IN (
    SELECT cust.customer_id 
    FROM customer_1_binding_tbl AS cust 
    WHERE cust.mailinglist_id = '2') order by substring_index(email, '@', 1), 
    (case substring_index(email, '@', -1) 
      when ('gmail.com' or 'hotmail.com' or 'jednotavimperk.cz') then 1 
      when ('seznam.cz' or 'email.cz' or 'post.cz') then 2 
      when 'tiscali.cz' then 3 
      when ('centrum.cz' or 'atlas.cz' or 'volny.cz') then 4 
      else 999 
     end) 
+0

什麼是定義排序的模式? –

+0

電子郵件域。例如第一個Gmail,雅虎,seznam ..然後重複,直到所有的電子郵件已經這樣訂購。 @GordonLinoff –

+0

你可以使用MySQL [REGEXP](https://dev.mysql.com/doc/refman/5.1/en/regexp.html)exp:'HAVING email REGEXP'[az]'ORDER BY email DESC' – Alex

回答

1

您可以打開email列。然後,使用一個case來分配排序優先級:

order by substring_index(email, '@', 1), 
     (case substring_index(email, '@', -1) 
       when 'gmail.com' then 1 
       when 'hotmail.com' then 2 
       when 'yahoo.com' then 3 
       when 'seznam.cz' then 4 
       else 999 
      end) 

另一個方便的功能,這是field()。但是,它不給你一個else條款的簡單選項,用於非匹配。

編輯:

您編輯的代碼是錯誤的。這不是你如何在case中表達多個條件。試試這個:

order by substring_index(email, '@', 1), 
     (case when substring_index(email, '@', -1) in ('gmail.com', 'hotmail.com', 'jednotavimperk.cz') then 1 
       when substring_index(email, '@', -1) in ('seznam.cz', 'email.cz', 'post.cz') then 2 
       when substring_index(email, '@', -1) = 'tiscali.cz' then 3 
       when substring_index(email, '@', -1) in ('centrum.cz', 'atlas.cz', 'volny.cz') then 4 
       else 999 
      end) 
+0

沒有,這是行不通的。它留下了一個非常不尋常的秩序,但它與該模式無關。 –

+0

@ invincible.superman。 。 。設置一個SQL小提琴。這似乎完全符合你的要求。 –

+0

但我得到的問題是它不堅持這個順序。特別是與我的電子郵件地址的規模...我已編輯我的評論,告訴你我在用什麼。 @gordonLinoff –