MySQL ЗАКАЗАТЬ чередование значений - PullRequest
0 голосов
/ 07 мая 2020

У меня есть таблица со списком адресов электронной почты. Я хочу выбрать подмножество адресов электронной почты, но хочу, чтобы оператор ORDER BY проходил через доменную часть адреса электронной почты, подавая их через каждый другой.

Пример таблицы:

+----+-------------------+-------+
| id | email             | name  |
+----+-------------------+-------+
| 1  | bob@gmail.com     | Bob   | 
| 2  | tom@gmail.com     | Tom   |
| 3  | greg@gmail.com    | Greg  |
| 4  | lisa@gmail.com    | Lisa  |
| 5  | sally@yahoo.com   | Sally |
| 6  | aaron@yahoo.com   | Aaron |
| 7  | tim@yahoo.com     | Tim   |
| 8  | wanda@hotmail.com | Wanda |
| 9  | smith@hotmail.com | Smith |
| 10 | mark@hotmail.com  | Mark  |
+----+-------------------+-------+

Я анализирую доменную часть электронного письма с помощью substring_index (email, '@', -1).

Я бы выполнил запрос примерно так:

SELECT id, 
    email, 
    name 
FROM emails 
ORDER BY substring_index(email, '@', -1) 
    [something here to rotate every other result], 
    id ASC

И я бы хотите, чтобы результаты выглядели так:

+----+-------------------+-------+
| id | email             | name  |
+----+-------------------+-------+
| 1  | bob@gmail.com     | Bob   | 
| 8  | wanda@hotmail.com | Wanda |
| 5  | sally@yahoo.com   | Sally |
| 2  | tom@gmail.com     | Tom   |
| 9  | smith@hotmail.com | Smith |
| 6  | aaron@yahoo.com   | Aaron |
| 3  | greg@gmail.com    | Greg  |
| 10 | mark@hotmail.com  | Mark  |
| 7  | tim@yahoo.com     | Tim   |
| 4  | lisa@gmail.com    | Lisa  |
+----+-------------------+-------+

Возможно ли это что-то для перебора элемента во время ORDER BY?

Любые советы / идеи будут ОЧЕНЬ признательны :)

1 Ответ

1 голос
/ 07 мая 2020

Вы не упоминаете, какую версию MySQL вы используете, поэтому я предполагаю, что это современная версия (8.x).

Вы можете сделать:

select id, email, name,
from (
  select id, email, name,
    substring_index(email, '@', -1) as dom,
    row_number() over(partition by substring_index(email, '@', -1) 
                      order by name) as rn
  from emails
) x
order by rn, dom
...