mysql - 如何从 MySQL 单表创建组合表?
问题描述
所以我有这个下表选项可以说它包含三列:
--------------------------
--------- options --------
--------------------------
id | name | category
--------------------------
1 | blue | 1
2 | red | 1
3 | a | 2
4 | b | 2
5 | c | 2
6 | 99 | 3
--------------------------
现在,我已经有以下查询来创建一个包含三列的表作为上表的组合:
SELECT T1.name, T2. name, T3.name
FROM (options T1 JOIN options T2 ON (T1.name > T2.name AND T1.category != T2.category))
LEFT JOIN options T3
ON (T3.name < T2.name AND T3.name < T1.name AND T3.category != T1.category AND T3.category != T2.category);
运行上述查询的结果将返回下表(不 正确):
--------------------------
------ combinations ------
--------------------------
name | name | name
--------------------------
blue | a | 99
red | a | 99
blue | b | 99
red | b | 99
blue | c | 99
red | c | 99
red | 99 | NULL
blue | 99 | NULL
a | 99 | NULL
b | 99 | NULL
c | 99 | NULL
--------------------------
结果表应如下所示:
--------------------------
------ combinations ------
--------------------------
name | name | name
--------------------------
blue | a | 99
red | a | 99
blue | b | 99
red | b | 99
blue | c | 99
red | c | 99
--------------------------
问题是,只要选项中有 3 个不同的类别,组合还将返回包含NULL值的第三个名称列,我们不希望这样。
我希望生成的组合表始终有 3 列,如果只有一个类别仅填充组合表中的第一列(在这种情况下其他列应该为空),如果前两列有两个作为组合(第三列将为空),如果是三列,则所有三列都必须具有与选项表相对应的值(无空值)。
解决方案
使用cross join
:
select *
from (select name
from options
where category = 1
) n1 cross join
(select name
from options
where category = 2
) n2 cross join
(select name
from options
where category = 3
) n3
推荐阅读
- php - 如何删除mpdf中的块元素边距?
- tensorflow - 在 Keras 中使用二元交叉熵训练多类 NN 比使用分类交叉熵获得更高的分数
- python - python Selenium send_keys 到 Jupyter 笔记本
- terraform - 无法将 S3 后端与 Terraform 一起使用 - 缺少凭据
- javascript - 将 rxjs 5 映射转换为 rxjs 6 映射
- python - Python SKLearn 拟合值错误输入
- android - 如何从firebase获取数据作为非实时数据库?
- android - Android Kotlin“未知场景名称:transitionManager”第 41 章 pg 308
- javascript - 如何自动化 ElectronJS 应用程序
- python - 为什么我的 Selenium 代码可以在 Python Shell 中运行,但不能在文件中运行?