Mysql 使用空值将表连接到自身

Mysql 使用空值将表连接到自身,mysql,join,null,Mysql,Join,Null,我相信应该有一个简单的方法来做到这一点,但我被困在这里!我在这里和其他地方读了20多页,但找不到我想要的 我有一个包含数千行和数十列的表,但为了简化,让我们想象一下下表qu是我的数据: +----+-----+-----+------+ | id | PID | AID | Data | +----+-----+-----+------+ | 1 | A | 1 | 56 | | 2 | A | 2 | 234 | | 3 | B | 1 | 23 | |

我相信应该有一个简单的方法来做到这一点,但我被困在这里!我在这里和其他地方读了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   |
+-----+-----+------+
基本上,我希望查询为
PID
s填充所有缺少的
AID
,并为它们的
数据添加
NULL
NA
。我可以通过在MySQL外部执行循环来实现这一点,但速度非常慢,因为我需要对每个
PID
AID
组合运行单独的查询,以获得
数据

这是我最近的一次尝试,但没有成功

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`

您可以在此处使用日历表方法:

SELECT
    q1.PID,
    q2.AID,
    q3.Data   -- or use COALESCE(q3.Data, 'NA') AS Data
FROM (SELECT DISTINCT PID FROM qu) q1
CROSS JOIN (SELECT DISTINCT AID FROM qu) q2
LEFT JOIN qu q3
    ON q3.PID = q1.PID AND
       q3.AID = q2.AID
ORDER BY
    q1.PID,
    q2.AID;

这里的想法是,我们使用别名为
t1
t2
的不同子查询之间的交叉连接来生成
PID
AID
的所有可能组合。然后,我们用实际的
qu
表离开join,如果可用,它要么引入数据,否则
NULL
如果不可用。

WOW Tim,你太棒了!从不知道交叉连接
。谢谢我为此花了两天多的时间!:)如何获取自定义定义的值而不是
NULL
,例如
NA