我有以下表格:
高尔夫球手:
| vID | vGolfer |
|-----|---------|
| 1 | Johnson |
| 2 | Thomas |
| 3 | Rahm |
| 4 | Spieth |
| 5 | Rose |
花名册:
| key | vPlayer | vID |
|-----|---------|-----|
| 1 | Player1 | 1 |
| 2 | Player1 | 2 |
| 3 | Player1 | 3 |
| 4 | Player1 | 4 |
| 5 | Player1 | 5 |
其中 Roster.vID=Golfers.vID,每个玩家都可以选择 5 名高尔夫球手加入他们的“花名册”。
分数:
| key | vID | vRound | vScore |
|-----|-----|--------|--------|
| 1 | 1 | Rd1 | 71 |
| 2 | 1 | Rd2 | 70 |
| 3 | 1 | Rd3 | 71 |
| 4 | 1 | Rd4 | 69 |
其中 Scores.vID=Golfers.vID。
我的目标是在网页的表格中显示每个“花名册”,输出如下:
| Player1 | Rd1 | Rd2 | Rd3 | Rd4 |
|---------|-----|-----|-----|-----|
| Johnson | 71 | 68 | 72 | 69 |
| Spieth | 70 | 70 | 68 | 71 |
| Thomas | 72 | 71 | 71 | 70 |
| Rahm | 69 | 68 | 71 | 70 |
我尝试使用以下查询:
SELECT
g.vName,
(select vPlayer from vroster where vID = g.vID) as Player,
(select vScore from vscorecard where vID = g.vID and vRound='Rd1') as Round1
(select vScore from vscorecard where vID = g.vID and vRound='Rd2') as Round2
(select vScore from vscorecard where vID = g.vID and vRound='Rd3') as Round3
(select vScore from vscorecard where vID = g.vID and vRound='Rd4') as Round4
FROM vgolfers g
但是,我收到错误代码 1242。子查询返回多于 1 行。我知道我正在尝试获取 vPlayer = "Player1"和每个后续玩家的多行,但我该如何解决这个问题?
最佳答案
您的示例数据有很多问题:
- 您使用
key
作为列名。我什至不知道你是如何设置你的表格的,所以我使用了keyx
因为这只是一个例子。查找保留字key在这里。 - 每个别名后都缺少逗号(
Round1
、Round2
、Round3
)。 - 示例表名称不是您在示例查询中使用的名称(
Golfers
vsvgolfers
;Scores
vsvscorecard
等。) g.vName
列不存在,但g.vGolfer
存在。
无论如何...
您没有提供名为 Rose 的高尔夫球手的分数,所以我只为他们的分数输入了 0
。
以下查询将显示您想要的内容:
SELECT
g.vGolfer,
(select vPlayer from Roster where vID = g.vID) as Player,
(select vScore from Scores where vID = g.vID and vRound='Rd1') as Round1,
(select vScore from Scores where vID = g.vID and vRound='Rd2') as Round2,
(select vScore from Scores where vID = g.vID and vRound='Rd3') as Round3,
(select vScore from Scores where vID = g.vID and vRound='Rd4') as Round4
FROM Golfers g
请看这个[DEMO]
编辑:如果您有其他玩家:
SELECT
g.vGolfer,
r.vPlayer as Player,
MAX(CASE WHEN s.vround = 'Rd1' THEN s.vScore ELSE 0 END) AS Rd1,
MAX(CASE WHEN s.vround = 'Rd2' THEN s.vScore ELSE 0 END) AS Rd2,
MAX(CASE WHEN s.vround = 'Rd3' THEN s.vScore ELSE 0 END) AS Rd3,
MAX(CASE WHEN s.vround = 'Rd4' THEN s.vScore ELSE 0 END) AS Rd4
FROM Golfers g
INNER JOIN Roster r ON g.vID = r.vID
INNER JOIN Scores s ON g.vID = s.vID AND r.keyx = s.keyx
GROUP BY g.vGolfer, r.vPlayer
ORDER BY r.vPlayer, g.vGolfer
关于php - 连接 3 个 MySQL 表,错误代码 1242 返回多于 1 行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49226398/