2017-05-22 4 views
0

Ich versuche, die Lösung für mein Problem zu realisieren, aber ich kann keinen Weg finden: Ich habe eine Benutzer/E-Mail/Domain-Tabelle in MySQL und ich möchte auswählen und bestellen durch Domain-Feld wie das Ergebnis würde mir eine sequentielle Liste, eine Domain zu einer Zeit geben.Sequenzielle Reihenfolge von in MySQL

Im Beispiel: sagen wir, dass meine vollständige Tabelle 10 Benutzer mit domain @ gmail.com ist; 10 Benutzer mit domain @ aol.com und 5 Benutzer mit domain @ hotmail.com. Das geordnete Ergebnis zu meinem SELECT-Namen, Domäne FROM mytable ORDER BY ??? sollte sein:

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 
... 

Und so weiter.

Jeder hat eine Ahnung, wie man diese Bestellung bekommt?

+0

Hilft 'ORDER BY domain, name' Ihnen dabei? –

+1

Ja. Siehe https://meta.stackoverflow.com/questions/333952/why-should-i-provide-an-mcve-for-what-seems-to-me-to-be-very-simple-sql-query – Strawberry

Antwort

0

Es gibt einen Ansatz, den ich mir vorstellen kann, der dies in einer MySQL-Abfrage erreichen wird. Aber es ist nicht schön, und es beruht auf einem Verhalten von benutzerdefinierten Variablen, das dokumentiert ist, undefined zu sein.

Betrachten Sie dies. Wenn wir eine Reihe von Zeilen wie folgt hatte:

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 

Dann könnten wir eine ORDER BY seq_, domain, user tun das angegebene Ergebnis zu erzielen.

Der Trick ist, die Werte für diese seq_ Spalte zu bekommen.

Wir können so etwas tun: Zeilen nach domain sortieren und dann die Zeilen in der Reihenfolge verarbeiten. Wenn wir den Wert der Domäne aus der aktuellen Zeile in eine benutzerdefinierte Variable speichern, können wir diese für die nächste Zeile verwenden, um einen Vergleich durchzuführen (den Wert aus der aktuellen Zeile mit dem in der vorherigen Zeile gespeicherten Wert zu vergleichen).) Wenn der Wert der Domain ist die gleiche, wir SEQ_ Erhöhungsschritte, sonst, setzen wir SEQ_ auf 1

Wie gesagt, es ist nicht schön:

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 

Auch dies stützt sich auf das Verhalten von User- definierte Variablen, die nicht garantiert sind. Aber bei sorgfältig gestalteten Abfragen beobachten wir konsistentes Verhalten mit MySQL 5.1, 5.5 und 5.6.