我有一个具有以下架构的表:
mysql> desc player_salaries;
+---------------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+---------------+--------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| position | varchar(10) | NO | | NULL | |
| first_name | varchar(100) | NO | | NULL | |
| last_name | varchar(100) | NO | | NULL | |
| player_id | int(11) | NO | | NULL | |
| team | varchar(255) | YES | | NULL | |
| opponent | varchar(255) | YES | | NULL | |
| ppg | int(11) | YES | | NULL | |
| salary | varchar(255) | NO | | NULL | |
| injury_status | varchar(255) | YES | | NULL | |
| site_id | int(11) | NO | MUL | NULL | |
| created_at | datetime | YES | | NULL | |
| updated_at | datetime | YES | | NULL | |
| gamedate | date | NO | MUL | NULL | |
| sport_id | int(11) | YES | | 0 | |
+---------------+--------------+------+-----+---------+----------------+
这里奇怪的是,1 个玩家的每个 gamedate
都有 4 行,并且每行属于不同的 site_id
。因此,要获取特定玩家在特定日期的每个 site
的工资,我可以编写如下查询:
从player_salaries中选择工资,site_id,其中player_id = ? AND 游戏日期 = ?
我想要的不是通过上述查询获取 4 行,而是为每个玩家返回一行,每个 site_id
的工资在其自己的列中。使用 SELF JOIN
类型查询可以实现这一点吗?
最佳答案
一种选择是按照标题所示将表连接
回自身。
SELECT ps1.salary,
ps2.salary,
ps3.salary,
ps4.salary
FROM player_salaries ps
JOIN player_salaries ps1 ON
ps.player_id = ps1.player_id AND
ps.gamedate = ps1.gamedate AND
ps1.site_id = 1
JOIN player_salaries ps2 ON
ps.player_id = ps2.player_id AND
ps.gamedate = ps2.gamedate AND
ps2.site_id = 2
JOIN player_salaries ps3 ON
ps.player_id = ps3.player_id AND
ps.gamedate = ps3.gamedate AND
ps3.site_id = 3
JOIN player_salaries ps4 ON
ps.player_id = ps4.player_id AND
ps.gamedate = ps4.gamedate AND
ps4.site_id = 4
WHERE ps.player_id = ? AND ps.gamedate = ?
或者,更简单的方法是将 MAX
与 CASE
结合使用:
Select Max(Case When Site_id = 1 Then salary end) salary1,
Max(Case When Site_id = 2 Then salary end) salary2,
Max(Case When Site_id = 3 Then salary end) salary3,
Max(Case When Site_id = 4 Then salary end) salary4
From player_salaries
where ps.player_id = ? AND ps.gamedate = ?
Group by player_id
关于MySQL 进行自连接以将具有公共(public) ID 的记录组合起来,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23861034/