SQL / MySQL - 如何在一对多关系中实现AND子句?

时间:2014-02-17 12:02:53

标签: mysql sql

我确信这是一个常见问题,但我似乎无法想出答案。

如果我有一对一关系的表,我该如何实现一个查询,其中必须满足关系“很多”方面的所有指定项目才能返回记录? / p>

例如


Person               Person_Feature               Feature

PersonID Name        PersonID  FeatureID          FeatureID  Description
1        Dave        1         1                  1          Tall
2        Bill        1         2                  2          Black
                     1         3                  3          Male
                     2         1                  4          White
                     2         4                                  
                     2         3                   

如果我允许用​​户从功能表中选择功能,我将如何编写一个查询,该查询只返回一个全部所选功能的人,但很少或很多可能是?

因此寻找一个身材高大的黑人男性会让Dave而不是Bill回归,但寻找一个身材高大的男性会让两人都回归。

3 个答案:

答案 0 :(得分:1)

这个应该有效:

SELECT P.Name
FROM Person P
  JOIN Person_Feature PF
    ON P.PersonID = PF.PersonID
  JOIN Feature F 
    ON PF.FeatureID = F.FeatureID
WHERE F.Description IN ('Tall','Black')
GROUP BY P.PersonID
HAVING COUNT(*) = 2

基本上我选择所有具有给定搜索条件并按ID分组的人。然后我用COUNT过滤它们。如果有2个标准,那意味着应该有2行(如果有3个,COUNT(*)应该是3个)。如果计数小于标准数,那么这意味着该人不符合所有标准(但只有一些标准)。

答案 1 :(得分:0)

尝试这样的事情:

SELECT P.Name
FROM Person P
JOIN Person_Feature PF ON P.PersonID = PF.PersonID
JOIN Feature F ON PF.FeatureID = F.FeatureID
WHERE F.Description in ('Tall','Black');

如果这不能正确理解您的要求,请详细说明,以便我可以增强查询。

答案 2 :(得分:0)

SELECT P.Name
FROM Person P
JOIN Person_Feature PF ON P.PersonID = PF.PersonID
JOIN Feature F ON PF.FeatureID = F.FeatureID
WHERE F.Description IN ('Tall','Black')
GROUP BY P.PersonID 
HAVING COUNT(DISTINCT F.Description) = SELECT COUNT(DISTINCT G.Description) 
FROM G.Feature WHERE G.Description IN ('Tall','Black');

这不是经过测试的代码。请原谅任何语法错误。将其视为伪代码