2017-05-22 20 views
0

私の問題の解決策を実現しようとしていますが、私は方法を見つけることができません:MySQLにユーザ/電子メール/ドメインテーブルがあります。結果のようなドメインフィールドでは、一度に1つのドメインを順番に並べることができます。シーケンシャルオーダーby MySQL

例:フルテーブルがdomain @ gmail.comを持つ10人のユーザーであるとします。 domain @ aol.comのユーザーは10人、domain @ hotmail.comのユーザーは5人です。私の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_列の値を取得しています。

次のようなことができます:order rows by domain、次に順番に行を処理します。現在の行のドメインの値をユーザー定義の変数に保存すると、次の行にその値を使用して比較を行います(現在の行の値と前の行の値を比較します)。私が言ったように)ドメインの値が同じであれば、我々はseq_をインクリメントし、そうでない、我々は1

にseq_をリセットし、それはかなりありません。

再び
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 

、これはUSER-の行動に依存しています定義された変数は保証されません。しかし、注意深く作成されたクエリでは、MySQL 5.1,5.5、および5.6での一貫した動作が観察されます。