首页 > 解决方案 > 如何从 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 列,如果只有一个类别仅填充组合表中的第一列(在这种情况下其他列应该为空),如果前两列有两个作为组合(第三列将为空),如果是三列,则所有三列都必须具有与选项表相对应的值(无空值)。

标签: mysqlsqlmysql-workbenchcombinationspermutation

解决方案


使用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

推荐阅读