2014-01-08 2 views
0
Mentor table 
+--------------+ 
| id | name | 
+-----+--------+ 
| 1 | name1 | 
| 2 | name2 | 
| 3 | name3 | 
+-----+--------+ 

MentorLanguage table 
+------------------+ 
| id | language | 
+-----+------------+ 
| 1 | english | 
| 1 | french | 
| 1 | german | 
| 2 | chinese | 
| 2 | english | 
| 3 | russian | 
| 3 | german | 
| 3 | greek | 
+-----+------------+ 

Student table 
+--------------+ 
| id | name | 
+-----+--------+ 
| A | name1 | 
| B | name2 | 
| C | name3 | 
+-----+--------+ 

StudentLanguage table 
+------------------+ 
| id | language | 
+-----+------------+ 
| A | english | 
| A | french | 
| B | chinese | 
| B | german | 
| C | russian | 
| C | spanish | 
| C | greek | 
+-----+------------+ 


Я хочу, чтобы соответствовать mentor с student на основе language, таким образом, что, например:выберите строки, основанные на ИНЕКЕ, которые возвращают несколько строк

если student A знает english и french, он будет сравниваться со всеми mentors, которые знают не менее english или french.

student A (english, french) 
--------------------------------- 
mentor 1 (english, french, german); 
mentor 2 (chinese, english); 


Я попытался

select * from Mentor m 
where m.id = 
(select ml.id from MentorLanguage ml, StudentLanguage sl 
    where ml.language like sl.language 
    group by ml.id) 

, который не работает, так как Subquery returned more than 1 value.

+1

вы можете изменить значение = с IN следующим образом: WHERE m.id IN (SELECT ... – wxyz

ответ

0

Вы можете попробовать использовать оператор «IN» вместо = в предложении where. Это позволяет вам делать «содержит» вместо сравнения с одним значением.

select * from Mentor m 
where m.id IN 
(select ml.id from MentorLanguage ml, StudentLanguage sl 
    where ml.language like sl.language 
    group by ml.id) 
0

Существует множество способов сделать это. Думаю, это зависит только от ваших предпочтений и/или необходимости в наборе результатов. Я включил два пути, чтобы встретить этот запрос. Довольно просто. Дайте мне знать, если вам нужны дополнительные возвращенные результаты.

CREATE TABLE #Mentor ([id] INT Identity, [name] NVARCHAR(20)) 
GO 

INSERT INTO #Mentor(name) 
VALUES ('John Smith'),('Jack Smith'),('Jane Smith') 

CREATE TABLE #MentorLanguage ([id] INT, [language] NVARCHAR(20)) 
GO 

INSERT INTO #MentorLanguage([id],[language]) 
VALUES (1,'English'),(1,'French'),(1,'German') 
     ,(2,'Chinese'),(2,'English'),(3,'Russian') 
     ,(3,'German'),(3,'Greek') 

CREATE TABLE #Student([id] NVARCHAR(2), [name] NVARCHAR(20)) 
GO 

INSERT INTO #Student ([id],[name]) 
VALUES ('A','name1'),('B','name2'),('C','name3') 

CREATE TABLE #StudentLanguage ([id] NVARCHAR(2),[language] NVARCHAR(20)) 
GO 

INSERT INTO #StudentLanguage ([id],[language]) 
VALUES ('A','English'),('A','French'),('B','Chinese'),('B','German'),('C','Greek') 

/* Inner Join to between #MentorLanguage and #StudentLanguage 
    would elimate rows where the mentor and student don't match */ 
SELECT * 
FROM #Mentor m 
INNER JOIN #MentorLanguage ml ON m.[id] = ml.id 
INNER JOIN #StudentLanguage sl ON ml.[language] = sl.[language] 
INNER JOIN #Student s ON s.id = sl.id 

/* Agg Count of how many students each mentor could teach 
    based on the languages students know */ 

SELECT m.name, count(s.id) as [count] 
FROM #Mentor m 
INNER JOIN #MentorLanguage ml ON m.[id] = ml.id 
INNER JOIN #StudentLanguage sl ON ml.[language] = sl.[language] 
INNER JOIN #Student s ON s.id = sl.id 
GROUP BY m.name 
0

Вы ожидали такого?

select 
Student.id StudentId, 
group_concat(distinct StudentLanguage.language) Languages, 
group_concat(distinct Mentor.id) MentorIds from 
Student join StudentLanguage on (Student.id = StudentLanguage.id) 
join MentorLanguage on (StudentLanguage.language = MentorLanguage.language) 
join Mentor on (MentorLanguage.id = Mentor.id) group by Student.id; 

что приводит:

+-----------+----------------+-----------+ 
| StudentId | Languages  | MentorIds | 
+-----------+----------------+-----------+ 
| A   | french,english | 1,2  | 
| B   | german,chinese | 1,3,2  | 
| C   | russian,greek | 3   | 
+-----------+----------------+-----------+ 

Для последней строки, C знаю испанский, но не наставники не знает. Если вам нужен испанский, также в списке используйте левое соединение.

+0

'group_concat' недопустим для SQL Server. –

+0

Спасибо за указание. Это эквивалентный запрос в mysql. – dipal

Смежные вопросы