我有一个看起来像这样的数据集
RID SID MID QID QText
------------------------------------------------------------------
NULL NULL NULL 10,20,30 't1','t2','t3'
10 14 13 4 'text2'
100 141 131 5,6 't5','t6'
我想运行一些sql命令,该命令基本上采用带有空值的行,并将QID和QText列连接到具有有效RID,SID,MID的每一行
所以最终结果将是一个类似于此的数据集(在这种情况下,第一行不需要在那里,因为我已将该行中的信息连接到其他行)。
RID SID MID QID QText
------------------------------------------------------------------
NULL NULL NULL 10,20,30 't1','t2','t3'
10 14 13 4,10,20,30 'text2','t1','t2','t3'
100 141 131 5,6,10,20,30 't5','t6','t1','t2','t3'
我已经尝试了几个具有不同分组的group_concats,但是无法让它以我需要的方式工作。原始SQL(mysql)可以实现这种转换吗?
到目前为止我尝试过的一些事情(非常糟糕的尝试,因为我只是不知道我将要做什么)
从myTable组中选择group_concat(QText)? < ---我不知道我可以分组的任何东西会给我我正在寻找的东西。这就是我非常糟糕的尝试。我知道他们错了(按id,qid等分组)。还考虑并尝试了我要连接的列的总和。
答案 0 :(得分:0)
如果要将NULL行与所有非NULL行分组,请为每个组创建一个副本。例如,您可以派生出不同RID, SID, MID
组合的列表
SELECT DISTINCT RID, SID, MID, QID, QText
FROM myTable
WHERE RID IS NOT NULL
OR SID IS NOT NULL
OR MID IS NOT NULL
并将其与NULL行交叉连接:
SELECT
groups.RID, groups.SID, groups.MID,
empty.QID, empty.QText
FROM
(
SELECT DISTINCT RID, SID, MID
FROM myTable
WHERE RID IS NOT NULL
OR SID IS NOT NULL
OR MID IS NOT NULL
) AS groups
CROSS JOIN
(
SELECT QID, QText
FROM myTable
WHERE RID IS NULL
AND SID IS NULL
AND MID IS NULL
) AS empty
然后将结果集合与原始集合组合:
SELECT RID, SID, MID, QID, QText
FROM myTable
UNION ALL
SELECT
groups.RID, groups.SID, groups.MID,
empty.QID, empty.QText
FROM
(
SELECT DISTINCT RID, SID, MID
FROM myTable
WHERE RID IS NOT NULL
OR SID IS NOT NULL
OR MID IS NOT NULL
) AS groups
CROSS JOIN
(
SELECT QID, QText
FROM myTable
WHERE RID IS NULL
AND SID IS NULL
AND MID IS NULL
) AS empty
现在只需将组合结果集用作派生表,并从中获取GROUP_CONCAT:
SELECT
RID, SID, MID,
GROUP_CONCAT(QID) AS QID,
GROUP_CONCAT(QText) AS QText
FROM
(
SELECT … /* the above UNION ALL query here */
) AS s
GROUP BY
RID, SID, MID
;