gpt4 book ai didi

php - MySQL 将多行连接为列

转载 作者:IT老高 更新时间:2023-10-28 23:52:13 25 4
gpt4 key购买 nike

假设我在 MySQL 数据库中有两个表。

表 1:

ID    Name
1 Jim
2 Bob

表 2:

ID    Place    Race_Number
1 2nd 1
1 3rd 2
1 4th 3
2 1st 1
2 2nd 2
2 2nd 3

从数据库中选择行时,有没有办法将第二个表中的行作为列连接到第一个表?目前我正在使用 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

目前我正在我的 PHP 脚本中对其进行排序,以将其排序为一个数组。这很痛苦,因为我必须查看 ID 并查看它们是否相同,然后进行相应的排序。我觉得有一种方法可以在 MySQL 中正确执行此操作,而无需在 PHP 中将其排序到数组中。每个 ID 在第二个表中可以有无限数量的条目。

来自 MySQL 查询的期望结果是:

ID    Name    Race1    Race2    Race3
1 Jim 2nd 3rd 4th
2 Bob 1st 2nd 2nd

我不能自己在表格中为 Race1、Race2 等创建列,因为每个 ID 可以有无限数量的比赛。

感谢您的帮助!

最佳答案

INNER JOIN 足以满足您的需求。 MySQL 没有 PIVOT 函数,你仍然可以使用 CASEMAX() 函数来模拟它。

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

但是如果你有未知数量的 RACE,那么 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;

关于php - MySQL 将多行连接为列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15462753/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com