MySQL合并两个选择以交错多行

时间:2018-10-15 17:06:10

标签: mysql

如果标题是抽象的,我深表歉意。

有没有办法在不同行中交织空字段?

例如原始表格:

enter image description here

模式:

CREATE TABLE `test` (
`id` int(6),
`name` varchar(20),
`content` varchar(20)
) DEFAULT CHARSET=utf8;
INSERT INTO `test` (`id`, `name`, `content`) VALUES
('1', Null, Null),
(Null, '1', 'aaa'),
(Null, '2', 'bbb'),
('2', Null, Null),
(Null, '3', 'ccc'),
(Null, '4', 'ddd'),
('3', Null, Null),
(Null, '5', 'eee'),
(Null, '6', 'fff');

所需结果:

enter image description here 谢谢您的宝贵时间和建议。

2 个答案:

答案 0 :(得分:1)

实际上并没有一种很好的方法来完成您的建议。行没有固有的顺序。您建议的交织假设一个不存在的顺序。

现在,如果“ test X row Y”始终属于id = X,那是另一回事了……

类似的东西应该起作用

SELECT tB.id, tA.name, tA.content
FROM t AS tA
INNER JOIN t AS tB ON tA.content LIKE CONCAT('test ', tB.id, ' %')
WHERE tA.id IS NULL
;

或者,使用字符串函数从id中提取content,也可以在没有连接的情况下获得类似的结果。

答案 1 :(得分:1)

不能保证数据库中的行按所需的顺序排序,因此,除非有某种方法可以将name / content列的值链接到id列,否则这不可能。

如果每个ID仅与两行相关联,并且测试的名称只是顺序编号,则可以将名称映射到ID并将它们连接起来。 (将id 1到name 1和2,id 2到name 3和4,依此类推):

SELECT a.id, b.name, b.content
FROM test a
JOIN test b
ON a.id = CEILING(b.name / 2)

我怀疑不是这种情况,因此最终您不可能在没有找到某种方式将id与其他两列相关联的情况下进行此选择。