mysql - 如何在 MySQL 中使用 join 和 order by 子句生成自动增量临时字段
问题描述
这是我的人民表
+----+------------------+------------+
| id | name | address |
+----+------------------+------------+
| 1 | Tony Stark | Chicago |
| 2 | Natasha Romanoff | Boston |
| 3 | Steve Rogers | Arkansas |
| 4 | Bruce Banner | Long Beach |
+----+------------------+------------+
这是我的角色表
+----+-----------------+-----------+
| id | role_name | people_id |
+----+-----------------+-----------+
| 1 | Iron Man | 1 |
| 2 | Black Widow | 2 |
| 3 | Captain America | 3 |
| 4 | Hulk | 4 |
+----+-----------------+-----------+
我想从这两个表中获取数据,并使用此查询生成自动递增序号字段
SELECT @rownum := @rownum + 1 as no, peoples.name, roles.role_name
FROM peoples
CROSS JOIN (select @rownum := 0) r
JOIN roles ON roles.people_id = peoples.id
ORDER BY peoples.name ASC
但结果不是我所期望的。这是结果
+------+------------------+-----------------+
| no | name | role_name |
+------+------------------+-----------------+
| 4 | Bruce Banner | Hulk |
| 2 | Natasha Romanoff | Black Widow |
| 3 | Steve Rogers | Captain America |
| 1 | Tony Stark | Iron Man |
+------+------------------+-----------------+
也许是因为 JOIN 和 ORDER BY。如何解决这个问题,所以我得到一个序列号?
解决方案
如果要在peoples
表上按名称应用行号,则应首先在子查询中生成它,然后加入该子查询:
SELECT
p.no,
p.name,
r.role_name
FROM
(
SELECT id, name, address, @rownum:=@rownum + 1 AS no
FROM peoples
ORDER BY name
) p
CROSS JOIN (SELECT @rownum := 0) t
INNER JOIN roles r
ON p.id = r.people_id
ORDER BY
p.no;
推荐阅读
- function - 使用函数获取组合
- javascript - 选择一个列表以生成另一个列表
- sql - 记录数正确显示,但当日期是相当旧的日期时,“新计算开始日期”列显示所有“######”格式,例如:01-DEC-1184
- excel - 如何用另一个工作表中关于另一个单元格值的另一个单元格信息有条件地替换excel中的单元格信息
- php - 通过字符串操作从另一个创建新变量
- python - 我正在学习 python,所以写了这个小代码来添加 2 个具有 ROI 的图像,但它显示错误
- mesos - OpenEBS 是否支持或有任何适用于 DCOS 或 MESOS 的插件?
- javascript - javascript映射折线,如果条件不匹配,则将不透明度设置为零
- java - 在哪里以及如何存储使用 Jar 执行的 python 脚本?
- c - 生产者/消费者:1 个生产者,多个消费者 - 1 个信号量,1 个互斥体,1 个条件变量