我有两个下拉列表,一个用于项目,第二个用于类别
我有一个选择ddproject我得到id,基于这个id我必须填充ddcategory。
表结构SQL FIDDLE
如果我从下拉列表中选择ProjectOne
,这里是简单的查询select id,name from tbcategory where id in(1,2)
但我的问题是我不知道在in
条件下会有多少价值。
C#:
第一个我拆分列名categoryid
并稍后获取值,使我感到困惑
同时让我知道我是以正确的方式还是以任何其他方式来实现这个
编辑: 或者我应该更改我的表结构,如果是,那么是什么模式?
答案 0 :(得分:3)
根据您的数据,类别和项目之间存在许多关系。因此,您需要建模另一个许多:许多表来保存数据建模这种关系。
首先,创建一个新表来保存Category和Project之间的Many:Many关系:
create table tbProjectCategory
(
tbProjectId INT,
tbCategoryId INT
);
然后,删除tbProject中的字符串逗号分隔关系 - 这没用。而是将链接插入Many Many表。 e.g:
insert into tbProjectCategory(tbProjectId, tbCategoryId) values (1, 1), (1, 2);
将项目1链接到第1类和第2类。
然后,要查找项目1的所有类别,您需要通过Many:Many链接表加入,按项目标识进行过滤:
select cat.id, cat.name
from tbcategory cat
inner join tbProjectCategory prjcat
on prjcat.tbCategoryId = cat.id
where prjCat.tbProjectId = 1;
为了简洁起见,我还删除了您的标识栏 - 这样可以更轻松地了解链接了哪些数据记录。
答案 1 :(得分:3)
我会创建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
这意味着在原始架构中:
(1,'ProjectOne','Mumbai','1,2,3');
(2,'ProjectTwo','USA','1,3');
要完成答案:
将实体关系存储在以逗号分隔的列表中并不是一个好习惯。您甚至可能很难分割该列值并使查询正常工作。
答案 2 :(得分:1)
是的,逗号分隔值不是在数据库中存储关系的好方法。您应该再创建一个表来定义两个原始表之间的关系:
create table tbProjectCategory (id int IDENTITY(1,1),projectId int, categoryId int)
然后你可以像这样查询projectId:
select * from tbcategory c
inner join tbProjectCategory pc on c.id = pc.categoryId
where projectId = 1;
请尝试这个小提琴:http://sqlfiddle.com/#!3/b11acb/2