如何从2列表转换多对多关系?

时间:2012-03-09 21:00:00

标签: mysql sql many-to-many pivot-table

假设我有这个数据库表(下面的一些示例代码),它存储了两个列表(在我的情况下是需求和测试用例)之间的关系,我想创建一个表,其中行显示测试用例和列,显示需求,指示器显示存在关系。

一些限制

  • 我没有更改数据库结构,因为它属于开源测试用例管理系统(TestLink)。
  • 可以为此编写一些代码,但我希望它可以在MySQL中完成。
  • 啊,是的,它使用MySQL,所以这必须在那个环境中工作。
  • 此功能过去存在,但已被删除,因为通常情况下,当有数万个测试用例和要求时,这种类型的工作会使数据库陷入困境。

    创建表pivotreq_id int(11), testcase_id int(11) );

    / *表pivot * /

    的数据

    插入pivotreq_idtestcase_id)值(1,1);

    插入pivotreq_idtestcase_id)值(2,2);

    插入pivotreq_idtestcase_id)值(3,3);

    插入pivotreq_idtestcase_id)值(4,1);

    插入pivotreq_idtestcase_id)值(5,2);

    插入pivotreq_idtestcase_id)值(6,3);

    插入pivotreq_idtestcase_id)值(2,1);

    插入pivotreq_idtestcase_id)值(3,2);

我想从查询中得到的是一个看起来像这样的表:

   1    2    3    4    5    6
1  x    x         x
2       x    x         x
3            x              x

注意:行是testcase_ids,列是'req_ids'

任何人都有关于如何使用SQL获取此功能的提示?

2 个答案:

答案 0 :(得分:1)

下面的

效率更高:

为test_cases创建一个表,比如

create table testCases(
id int(11) auto_increment,
testcase varchar(200),
primary key(id))

要求的一个表

requirements(
id int(11) auto_increment,
requirements varchar(200),
primary key(id))

然后在第三个表中映射关系

 create table matchRequirementsToTests(
 requirements varchar(200),
 testcase varchar(200),
primary key(requirements, testcase),
foreign key (requirements) references Requirements(id),
foreign key(test case) references Test_cases(id))

答案 1 :(得分:1)

select testcase_id, 
  if(sum(req_id = 1), 'X', '') as '1', 
  if(sum(req_id = 2), 'X', '') as '2', 
  if(sum(req_id = 3), 'X', '') as '3', 
  if(sum(req_id = 4), 'X', '') as '4', 
  if(sum(req_id = 5), 'X', '') as '5', 
  if(sum(req_id = 6), 'X', '') as '6'
from pivot
group by testcase_id;

这很难看,但确实有效:

+-------------+---+---+---+---+---+---+
| testcase_id | 1 | 2 | 3 | 4 | 5 | 6 |
+-------------+---+---+---+---+---+---+
|           1 | X | X |   | X |   |   | 
|           2 |   | X | X |   | X |   | 
|           3 |   |   | X |   |   | X | 
+-------------+---+---+---+---+---+---+
3 rows in set (0.00 sec)