2016-04-11 97 views
0

我有一个“人”表:选择记录匹配的两个或多个相关表

person_id name 

100   jack 

125   jill 

201   jane 

和许多子表,该为person_id可能是:

“划船”

id person_id 

1  100 

2  201 

'游泳'

id person_id 

1  125 

2  201 

“运行”

id person_id 
1  201 

“扔”

id person_id 

1  125 

2  201 

我希望能够选择谁参与两项活动所有的人,不管其中两个。

+4

我很肯定你应该只使用一个有'ActivityId'的关系表来代替。然后你可以使用:'SELECT p.person_id FROM Persons p INNER JOIN PersonActivities pa ON p.person_id = pa.person_id GROUP BY p.person_id HAVING(COUNT(DISTINCT pa.ActivityId)> = 2)' –

+0

@TimSchmelter:last在我的防守中,线路确实会说“谁参与了两项活动,无论哪两项......” – gbn

回答

1

作为伟大的@TimSchmelter(伟大的名字)提到,你应该真的有一个单一的PersonActivities表与id对应的特定活动。

话虽这么说,如果你必须与当前架构的工作,一个选项是UNION在一起的活动表,再算上这些人有两个或更多的记录,这意味着它们参与两个或两个以上的活动。

SELECT t1.person_id, t1.name 
FROM persons 
INNER JOIN 
(
    SELECT t.person_id, COUNT(t.person_id) AS activityCount 
    FROM 
    (
     SELECT person_id FROM rowing 
     UNION ALL 
     SELECT person_id FROM swimming 
     UNION ALL 
     SELECT person_id FROM running 
     UNION ALL 
     SELECT person_id FROM throwing 
    ) AS t 
    GROUP BY t.person_id 
    HAVING COUNT(t.person_id) > 1 
) t2 
    ON t1.person_id = t2.person_id 
+0

仅仅指出,这不是100%的工作,因为活动表有一个代理键,我不认为OP正在对每个表中的person_id强制一个唯一的约束。所以划船可以有同一个人两次,但+1的答案和你的编辑使用更好的模式 – gh9

+0

你可以添加一个“虚拟”的ActivityName或ActivityId列,你可以用于“GROUP BY”。例如:'... SELECT person_id,Activity ='Rowing'FROM rowing UNION ALL SELECT person_id,Activity ='Swimming'FROM swimming ...' –

相关问题