【发布时间】:2020-03-28 04:39:48
【问题描述】:
我相信应该有一个简单的方法来做到这一点,但我被困在这里!我已经在这里和其他地方阅读了 20 多页,但找不到我想要的。
我有一个包含数千行和数十列的表,但为简化起见,让我们想象下表qu 是我的数据:
+----+-----+-----+------+
| id | PID | AID | Data |
+----+-----+-----+------+
| 1 | A | 1 | 56 |
| 2 | A | 2 | 234 |
| 3 | B | 1 | 23 |
| 4 | B | 2 | 78 |
| 5 | B | 3 | 65 |
| 6 | C | 2 | 89 |
| 7 | C | 3 | 74 |
+----+-----+-----+------+
我想要一个生成以下结果的查询:
+-----+-----+------+
| PID | AID | Data |
+-----+-----+------+
| A | 1 | 56 |
| A | 2 | 234 |
| A | 3 | NULL |
| B | 1 | 23 |
| B | 2 | 78 |
| B | 3 | 65 |
| C | 1 | NULL |
| C | 2 | 89 |
| C | 3 | 74 |
+-----+-----+------+
基本上,我希望查询为PIDs 填充所有缺少的AID,并为它们的Data 值添加NULL 或NA。我可以通过在 MySQL 之外执行循环来实现这一点,但这非常慢,因为我需要为每个 PID 和 AID 组合运行单独的查询以获得 Data 值。
这是我最近的一次尝试,但没有成功!
SELECT
*
FROM
(
SELECT
`id`,
`PID`
FROM
`qu`
GROUP BY
`PID`
) `a`
LEFT OUTER JOIN(
SELECT
`id`,
`AID`
FROM
`qu`
GROUP BY
`AID`
) `b`
ON
`a`.`id` = `b`.`id`
LEFT OUTER JOIN `qu` `c` ON
`a`.`id` = `c`.`id` AND `b`.`id` = `c`.`id`
【问题讨论】: