我有ff架构:
教师
FacultyID
Name
标签
TagID
TagValue
tags_faculty
TagID
FacultyID
问题是如何找出拥有TagValue
中提供的任何List<tags>
的教师。 (请注意,由于某些DBA的设计,tagvalue
并非唯一,因此用户具有相同的tagvalue
,但tagid
不同)
我在C#中使用SQL Server和Linq。但只要结果正确,我就可以查询,程序,linq表达式。
答案 0 :(得分:1)
我会以INNER JOIN
的身份做到这一点。
SELECT f.FacultyID, f.Name
FROM faculty f
INNER JOIN tags_faculty tf ON tf.FacultyID = f.FacultyID
INNER JOIN tags t ON t.tagID = tf.tagID
WHERE t.tagID IN (<list of tagID:s>)
GROUP BY f.FacultyID
答案 1 :(得分:1)
使用LINQ to SQL尝试以下操作,其中TagsToMatch是您在内存中的字符串列表。
List<int> TagsToMatch = tags.Select(tag => TagID);
var matchingFaculty =
from facultyTag in dc.FacultyTags
where TagsToMatch.Contains(facultyTag.TagID)
select facultyTag.Faculty;
如果您使用的是EF 4,它应该优化您的M-M关系,以便您可以将其更改为以下内容。 EF 1不支持Contains语法。
var matchingFaculty =
from tag in dc.Faculties
where !TagsToMatch.Contains(tag.TagID)
from faculty in tag.Faculties
select faculty;
无论哪种方式,如果教职员工在多个匹配的标签中,您可能希望在最后使用Distinct子句。
答案 2 :(得分:0)
如果我正确理解了您的问题,那么我认为此查询可以为您提供帮助。可能是一个效率低下的查询,但请检查这是否给出了您要查找的结果 -
select FacultyID, Name
from faculty
where facultyID in
( select tf.FacultyID from tags_faculty tf
inner join tags t
on t.tagID = tf.tagID
where t.tagValue in ( <your tag value list> )
)
也许额外的DISTINCT
条款也可能有所帮助。
答案 3 :(得分:0)
SELECT
*
FROM
faculty
WHERE
EXISTS (
SELECT
*
FROM
tags_faculty
WHERE
TagID IN (SELECT TagID FROM tags WHERE TagValue IN (<your list of tag values>))
AND FacultyID = faculty.FacultyID
)
如何实现标签值列表有很多选项。
您可以将查询生成为字符串,然后将标记推送给自己。但是你需要小心注射攻击等。
或者您可以生成一个字符串,其中所有标记都以,
分隔,然后使用函数将其拆分为值表。 (在SO和其他来源上有许多这样的功能。)