Mysql - 将多列合并为一列,同时保留每个值

Mysql - Merge multiple columns into one while preserving each value

Mysql 中是否有一种简单的方法可以将多列结果集转换为单列结果集,其中单列中的每一行都包含来自多列结果集中每个单元格的单个值?

例如,假设我有一个 table 比如:

    id    |   fk1   |   fk2   |   fk3   
    1          2         3         4
    5          6         7         8

理想情况下,我希望能够运行查询:

SELECT <some_function>(fk1, fk2, fk3) AS value FROM myTable;

...然后得到如下输出:

  value  
    2
    3
    4
    6
    7
    8

是否有一种直接的方法,或者是在代码中遍历多列结果集并将值提取为我想要的格式的唯一真正选择?

最终目标是能够在输入只能是单列值的上下文中将第一个查询用作子查询,例如:

SELECT * FROM myOtherTable WHERE id IN 
    (SELECT <some_function>(fk1, fk2, fk3) AS value FROM myTable);

因此,如果存在纯 SQL 解决方案,则更可取。

最简单的方法是使用union all:

select fk1 from mytable union all
select fk2 from mytable union all
select fk3 from mytable;

还有其他方法,但这是最简单的。

对于您的特定查询,您可以使用 existsorin:

SELECT mo.*
FROM myOtherTable mo
WHERE EXISTS (SELECT 1
              FROM MyTable m
              WHERE mo.id IN (m.fk1, m.fk2, m.fk3)
             );

编辑:

为了性能,但在每个 fk 列上建立索引并在 where 中使用多个条件:

SELECT mo.*
FROM myOtherTable mo
WHERE EXISTS (SELECT 1 FROM MyTable m WHERE mo.id = m.fk1) OR
      EXISTS (SELECT 1 FROM MyTable m WHERE mo.id = m.fk2) OR
      EXISTS (SELECT 1 FROM MyTable m WHERE mo.id = m.fk3);

这将进行索引查找,这应该比原始形式快得多。

考虑一下你 table name tab1.

现在您可以像

这样查询
select fk1 from (
   (select fk1 from tab1) 
      union all 
   (select fk2 from tab1)) as rt 
      group by fk1;

这会将您的两列合二为一。包含会陆续出现。