Mysql 使用空值将表连接到自身
我相信应该有一个简单的方法来做到这一点,但我被困在这里!我在这里和其他地方读了20多页,但找不到我想要的 我有一个包含数千行和数十列的表,但为了简化,让我们想象一下下表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 | |
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
?