Mas*_*ers 19 php mysql sql join
假设我在MySQL数据库中有两个表.
表格1:
ID Name
1 Jim
2 Bob
Run Code Online (Sandbox Code Playgroud)
表2:
ID Place Race_Number
1 2nd 1
1 3rd 2
1 4th 3
2 1st 1
2 2nd 2
2 2nd 3
Run Code Online (Sandbox Code Playgroud)
从数据库中选择行时,有没有办法将第二个表中的行作为列连接到第一个表?目前我正在使用SELECT * FROM Table1 NATURAL JOIN Table2.
这输出:
ID Name Place Race_Number
1 Jim 2nd 1
1 Jim 3rd 2
1 Jim 4th 3
2 Bob 1st 1
2 Bob 2nd 2
2 Bob 2nd 3
Run Code Online (Sandbox Code Playgroud)
目前,我正在我的PHP脚本中对其进行排序,以将其排序为数组.这是一个痛苦,因为我必须查看ID并查看它们是否相同然后进行相应排序.我觉得有一种方法可以在MySQL中做到这一点,而无需将其排序到PHP中的数组中.每个ID在第二个表中可以有无限数量的条目.
MySQL查询中的所需结果是:
ID Name Race1 Race2 Race3
1 Jim 2nd 3rd 4th
2 Bob 1st 2nd 2nd
Run Code Online (Sandbox Code Playgroud)
我不能在表格中为Race1,Race2等创建列,因为每个ID可以有无限数量的比赛.
谢谢你的帮助!
Joh*_*Woo 41
一个INNER JOIN就足够了您的需求.MySQL没有任何PIVOT功能,您仍然可以使用CASE和MAX()功能来模拟它.
SELECT a.ID, a.NAME,
MAX(CASE WHEN b.Race_Number = 1 THEN b.Place ELSE NULL END) Race1,
MAX(CASE WHEN b.Race_Number = 2 THEN b.Place ELSE NULL END) Race2,
MAX(CASE WHEN b.Race_Number = 3 THEN b.Place ELSE NULL END) Race3
FROM Table1 a
INNER JOIN Table2 b
ON a.ID = b.ID
GROUP BY a.ID, a.Name
Run Code Online (Sandbox Code Playgroud)
但是如果你的数量不详RACE,那么a DYNAMIC SQL更受欢迎.
SET @sql = NULL;
SELECT
GROUP_CONCAT(DISTINCT
CONCAT('MAX(CASE WHEN b.Race_Number = ', Race_Number,
' THEN b.Place END) AS ', CONCAT('`Race', Race_Number, '`'))
) INTO @sql
FROM Table2;
SET @sql = CONCAT('SELECT s.Student_name, ', @sql, '
FROM Table1 a
LEFT JOIN Table2 b
ON ON a.ID = b.ID
GROUP BY a.ID, a.Name');
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
16936 次 |
| 最近记录: |