在Mysql中有一种简单的方法可以将多列结果集转换为单列结果集,其中单列中的每一行都包含多列结果集中每个单元格的单个值吗?
例如,假设我有一张表:
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解决方案,则更可取。
答案 0 :(得分:1)
最简单的方法是使用union all
:
select fk1 from mytable union all
select fk2 from mytable union all
select fk3 from mytable;
还有其他方法,但这是最简单的。
对于您的特定查询,您可以使用exists
和or
或in
:
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);
这将进行索引查找,这应该比原始表单快得多。
答案 1 :(得分:0)
考虑你的表名tab1。
现在你可以像
那样进行查询select fk1 from (
(select fk1 from tab1)
union all
(select fk2 from tab1)) as rt
group by fk1;
这会将您的两列合并为一列。包含将一个接一个地出现。