【问题标题】:MySQL ORDER BY rotating through valuesMySQL ORDER BY 轮换值
【发布时间】:2020-08-22 03:52:46
【问题描述】:

我有一个包含电子邮件地址列表的表格。我想选择电子邮件地址的子集,但我希望 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 期间迭代项目?

任何建议/见解将不胜感激:)

【问题讨论】:

  • 这几乎肯定会在您的应用层更容易处理。
  • 这可以在 MySQL 8.x 中轻松完成。您使用的是 MySQL 5.x 还是 8.x?

标签: mysql loops sql-order-by email-address


【解决方案1】:

您没有提及您使用的是哪个版本的 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

【讨论】:

    猜你喜欢
    • 2010-10-31
    • 2015-02-26
    • 2019-10-29
    • 2013-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多