php - 连接 3 个 MySQL 表,错误代码 1242 返回多于 1 行

标签 php mysql join html-table

我有以下表格:

高尔夫球手:

| 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"和每个后续玩家的多行,但我该如何解决这个问题?

最佳答案

您的示例数据有很多问题:

  1. 您使用 key 作为列名。我什至不知道你是如何设置你的表格的,所以我使用了 keyx 因为这只是一个例子。查找保留字key在这里。
  2. 每个别名后都缺少逗号(Round1Round2Round3)。
  3. 示例表名称不是您在示例查询中使用的名称(Golfers vs vgolfersScores vs vscorecard 等。)
  4. 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  

enter image description here

请看这个[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

enter image description here

[UPDATED DEMO]

关于php - 连接 3 个 MySQL 表,错误代码 1242 返回多于 1 行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49226398/

相关文章:

php - 在 PHPMyAdmin 中收到 MySQL 错误

mysql - 如何在包含 JOIN 的查询中使用 ORDER BY?

Oracle 从两个表中选择数据,如果一个为空返回 null

php - CodeIgniter $this->input->get() 不工作

php - Google 条形图定制

mysql - 关于日期时间的 SQL 请求

MySQL 管道排序似乎不起作用

mysql - CROSS JOIN + LEFT JOIN 子查询的替代策略?

php - Laravel:检查 Controller 上的数据是否为整数

php - 解锁的论坛帖子说已锁定?