我有两个下拉列表,一个用于项目,第二个用于类别。
我有一个选择ddproject在那里我得到id,基于这个id我必须填充ddcategory。
表结构
这里有一个简单的查询,如果我从下拉列表中选择ProjectOne
select id,name from tbcategory where id in(1,2)
但是我的问题是我不知道在in
条件下会有多少值。
C #:首先,我分割列名称categoryid
,然后获得值,我很困惑。
也让我知道我做的是正确的方式还是其他的方法来实现这个
编辑:或者我应该改变我的表结构,如果是,那么模式是什么?
根据您的数据,Category和Project之间存在许多:许多的关系。因此,您需要对另一个Many:Many表进行建模,以保存对这种关系进行建模的数据。
SQL Fiddle Here
首先,创建一个新表来保存Category和Project之间的Many:Many关系:
create table tbProjectCategory
(
tbProjectId INT,
tbCategoryId INT
);
然后,删除tbProject中以逗号分隔的字符串关系——这是没有用的。相反,将链接插入到Many Many表中。例如:
insert into tbProjectCategory(tbProjectId, tbCategoryId) values (1, 1), (1, 2);
将项目1连接到类别1和类别2。
然后,要找到项目1的所有类别,您需要通过Many:Many链接表进行连接,并通过项目Id:
进行过滤。select cat.id, cat.name
from tbcategory cat
inner join tbProjectCategory prjcat
on prjcat.tbCategoryId = cat.id
where prjCat.tbProjectId = 1;
为了简洁起见,我还删除了您的身份栏-这使得更容易知道哪些数据记录被链接。
我将创建如下的M:N关系表:
tbProjects2Categories
IDCategory int;
IDProject int;
然后你可以查询:
SELECT c.id, c.name FROM tbCategory c JOIN tbProjects2Categories pc
ON c.IDCategory = pc.IDCategory
WHERE pc.IDProject = @selectedProjectId;
项目和类别之间的关系如下:
IDProject | IDCategory
1 | 1 1 | 2 1 | 3 2 | 1 2 | 3
它的意思是在你原来的schema中:
(1,'ProjectOne','Mumbai','1,2,3');
(2,'ProjectTwo','USA','1,3');
完成答案:
将实体关系存储在逗号分隔的列表中并不是一个好的做法。您甚至可能需要几天的时间来拆分列值并使您的查询工作。
是的,逗号分隔的值不是在数据库中存储关系的好方法。您应该再创建一个表来定义两个原始表之间的关系:
create table tbProjectCategory (id int IDENTITY(1,1),projectId int, categoryId int)
然后你可以根据投影来查询它,像这样:
select * from tbcategory c
inner join tbProjectCategory pc on c.id = pc.categoryId
where projectId = 1;
请试试这个提琴:http://sqlfiddle.com/#!3/b11acb/2