2017-05-22 53 views
0

我試圖爲我的問題實現解決方案,但我找不到方法:我在MySQL中有一個用戶/電子郵件/域表,我想選擇並訂購通過域字段如結果會給我一個順序列表,一次一個域。在MySQL中的順序排序

例如:假設我的整個表格是10個使用domain @ gmail.com的用戶; 10個用戶使用domain @ aol.com,5個用戶使用domain @ hotmail.com。將命令的結果添加到我的SELECT名稱,域FROM mytable ORDER BY ???應該是:

user_x, aol.com 
user_z, gmail.com 
user_y, hotmail.com 
user_a, aol.com 
user_c, gmail.com 
user_i, hotmail.com 
... when my five @hotmail.com records finished 
user_p, aol.com 
user_j, gmail.com 
user_t, aol.com 
user_f, gmail.com 
... 

等等。

任何人都有關於如何獲得此訂購的線索?

+0

'ORDER BY domain,name'有助於你的事業嗎? –

+1

是的。請參閱https://meta.stackoverflow.com/questions/333952/why-should-i-provide-an-mcve-for-what-seems-to-me-to-be-a-very-simple-sql-query – Strawberry

回答

0

我可以想到的一種方法是在MySQL查詢中實現這一點。但它並不漂亮,它依賴於用戶定義的變量的行爲,記錄爲未定義。

考慮一下。如果我們有這樣的一組行:

user domain  seq_ 
------ ------  ---- 
user_a aol.com  1 
user_p aol.com  2 
user_t aol.com  3 
user_x aol.com  4 
user_c gmail.com  1 
user_f gmail.com  2 
user_j gmail.com  3 
user_z gmail.com  4 
user_y hotmail.com 1 
user_i hotmail.com 2 

然後,我們可以做一個ORDER BY seq_, domain, user達到規定的結果。

訣竅是獲取該seq_列的值。

我們可以這樣做:按domain排序行,然後按順序處理行。如果我們將域的值從當前行保存到用戶定義的變量中,那麼我們可以將其用於下一行,以進行比較(將當前行的值與前一行保存的值進行比較)。 )如果域名的價值是一樣的,我們增加seq_,否則,我們將重置seq_爲1

正如我所說,這是不漂亮:

SELECT d.user 
    , d.domain 
    FROM (SELECT @seq := IF(t.domain = @domain, @seq + 1, 1) AS seq_ 
       , @domain := t.domain       AS domain 
       , t.user           AS user 
      FROM (SELECT @domain = '', @seq := 0) i 
      CROSS 
      JOIN mytable t 
      ORDER 
      BY t.domain 
       , t.user 
     ) d 
ORDER 
    BY d.seq_ 
    , d.domain 
    , d.user 

再次,這依賴於用戶的行爲不確定的變量。但通過精心設計的查詢,我們觀察到MySQL 5.1,5.5和5.6的一致行爲。