MySQL:UNION是我在寻找什么? (将行分为多行返回)

时间:2017-07-20 05:26:43

标签: mysql union

我有一个包含以下列的表:

id
first
last
institution
address
space1_1_value
space1_2_value
space2_1_value
space2_2_value
space3_1_value
space3_2_value
agreement
  

**例如,减少了字段数量。 **

最后,我想将我的查询导出到电子表格,但我似乎无法获得一个很好的工作查询。 (因此是帖子)

虽然表格中的一个记录/行将包含id,first,last,institution,address,space1_1_value,space1_2_value和agreement fields / cols ...

的值

它可能有也可能没有cols的值:

space2_1_value space2_2_value 和 space3_1_value space3_2_value

我不确定解释它..但或多或少,..我想将表中的每个记录/行分解为1-3'行'(缺少更好的解释)

所以对于表中的EACH ROW / RECORD ..

我想返回以下内容:

  

id |第一个|最后|机构|地址| space1_1_value |   space1_2_value |协议

如果space2_1_value中有值,则:

  

id |第一个|最后|机构|地址| space2_1_value |   space2_2_value |协议

如果space3_1_value中有值,则:

  

id |第一个|最后|机构|地址| space3_1_value |   space3_2_value |协议

总结..每个记录都包含上面列出的所有初始列。我试图通过'spaceX_X_value'组来“分解”每行的回报..如果不是空的话。

在这里阅读: http://www.mysqltutorial.org/sql-union-mysql.aspx

它说使用UNION垂直附加结果..

但我在工作时没有得到任何值得的东西。

尝试失败(似乎臃肿)......我觉得我可以在每个所需的行/结果中专门选择'static / commons'字段,并UNION / SELECT不同的spaceX_Xvalue组。

SELECT * FROM 
(
    (SELECT first, last, space2_value FROM report WHERE space2_value <> '')
    UNION
    (SELECT first, last, space3_value FROM report WHERE space3_value <> '')
) AS results

EDIT / UPDATE:

从下面的评论中......这是一个有效的例子:(感觉有点多余,输入相同的cols名称,如first,last..etc for each select)

SELECT first, last, space1_value as space_value FROM report
UNION
SELECT first, last, space2_value as space_value FROM report WHERE space2_value <> ''
UNION
SELECT first, last, space3_value as space_value FROM report WHERE space3_value <> ''
ORDER BY first

3 个答案:

答案 0 :(得分:2)

如果您不想自动删除重复的行,请考虑使用UNION ALL。

来自MySQL文档:

  

UNION的默认行为是从结果中删除重复的行。可选的DISTINCT关键字除了默认值之外没有任何影响,因为它还指定了重复行删除。使用可选的ALL关键字,不会发生重复行删除,结果包括所有SELECT语句中的所有匹配行。

答案 1 :(得分:1)

SELECT first, last, space2_value as space_value FROM report WHERE space2_value <> ''
        UNION
SELECT first, last, space3_value as space_value FROM report WHERE space3_value <> ''

UINION的每个查询中的列名必须相等

答案 2 :(得分:0)

使用 unpivot 将列设置为行:

数据:我创建了一个名为yourtable的表,并填充了一些数据:

id          first      last       institution address              space1_1_value space1_2_value space2_1_value space2_2_value space3_1_value space3_2_value agreement
----------- ---------- ---------- ----------- -------------------- -------------- -------------- -------------- -------------- -------------- -------------- --------------------
1           oliver     koo        mac         123 street           1              1              2              3              3              5              agree
2           mr.derp    herp       carl        sesame street        7              7              NULL           1              4              9              disagree

查询然后我执行了此查询,包括拖拽 unpivot关系运算符

SELECT id,first, last, institution, address, spacex_1_value , spacex_2_value
from yourtable

unpivot
(spacex_1_value for x1 in 
 (space1_1_value, space2_1_value,space3_1_value)
) unpvt1

unpivot
(
spacex_2_value for x2 in 
 (space1_2_value, space2_2_value,space3_2_value)
) unpvt2

WHERE SUBSTRING(x1,6,1) =  SUBSTRING(x2,6,1)

<强>结果:

id          first      last       institution address              spacex_1_value spacex_2_value
----------- ---------- ---------- ----------- -------------------- -------------- --------------
1           oliver     koo        mac         123 street           1              1
1           oliver     koo        mac         123 street           2              3
1           oliver     koo        mac         123 street           3              5
2           mr.derp    herp       carl        sesame street        7              7
2           mr.derp    herp       carl        sesame street        4              9

注意:where子句对于加入x1(未选中)和x2(未选中)列至关重要。没有它,我们没有告诉SQL Server第二组不透明数据如何与第一组匹配。 SQL会进行交叉连接。因此,必须使用where子句来过滤掉不需要的行。

希望这会有所帮助