MySQL 进行自连接以将具有公共(public) ID 的记录组合起来

标签 mysql sql activerecord

我有一个具有以下架构的表:

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 = ?

或者,更简单的方法是将 MAXCASE 结合使用:

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/

相关文章:

php - Mysql按参数复合录入(按日期)

MySQL - 真/假查询在两台服务器上返回不同

mysql - 如何在函数中使用变量

ruby-on-rails - ActiveRecord getter 中断验证

ruby-on-rails - Ruby Rails _without_ ActiveRecord

Mysql正则表达式用数字搜索

sql - 从连接表中获取额外数据

php - 如何过滤复杂 SQL 查询的结果?

mysql - 我可以在 MySQL 中获取 json 列的唯一/不同值吗?

mysql - Laravel 5 中的复杂查询