代码之家  ›  专栏  ›  技术社区  ›  JamesNickel

MySQL从具有相同亲属关系的关系表中进行选择

  •  3
  • JamesNickel  · 技术社区  · 7 年前

    我遇到的情况是,有一个关系表,如下所示:

    eaters:
    
    id   name     fruit
    1    jack     banana
    2    jack     apple
    3    jane     banana
    4    jane     apple
    5    jane     orange
    6    richard  banana
    7    richard  apple
    

    现在,谁吃过和“杰克”一样的水果?

    例如,在上表中,“Richard”是答案。

    我想到的伪查询是:

    SELECT name AS the_guy 
    FROM eaters 
    WHERE 
      (SELECT fruit FROM eaters WHERE name=the_guy) = 
      (SELECT fruit FROM eaters WHERE name='jack')
    

    我不知道这在MySQL中是否可行。目前,我获取了整个表,并使用PHP从结果中提取答案,这不是一个好方法。有什么建议吗?

    4 回复  |  直到 7 年前
        1
  •  1
  •   Madhur Bhaiya    7 年前

    一种方法是使用条件反射 Group_Concat() 具有 Having 条款我们可以得到所有的水果 jack

    现在,我们可以为其他人得到同样的水果订单,并使用 HAVING 条款考虑 name 与“jack_水果”匹配的值。

    SELECT t1.name AS the_guy 
    FROM eaters AS t1 
    JOIN (SELECT GROUP_CONCAT(fruit ORDER BY fruit) AS jack_fruits
          FROM eaters 
          WHERE name = 'jack') AS t2 
    WHERE t1.name <> 'jack' 
    GROUP BY t1.name 
    HAVING GROUP_CONCAT(t1.fruit ORDER BY fruit) = MAX(t2.jack_fruits );
    

    结果

    | the_guy |
    | ------- |
    | richard |
    

    View on DB Fiddle

        2
  •  5
  •   hgb123    7 年前

    你可以写:

    SELECT e2.name
    FROM   eaters e1
          INNER JOIN eaters e2
                  ON e1.fruit = e2.fruit
    WHERE  e1.name = 'Jack'
          AND e2.name != 'Jack'
    GROUP  BY e2.name 
    
        3
  •  2
  •   forpas    7 年前

    SELECT DISTINCT name FROM eaters 
    WHERE
        name <> 'Jack' 
        AND 
        fruit IN (SELECT fruit FROM eaters WHERE name = 'Jack')
    
        4
  •  1
  •   iminiki Shivam Krishna    7 年前

    最好使用这个:

    SELECT DISTINCT
           e.name
    FROM eaters e
    WHERE name <> 'jack'
          AND NOT EXISTS
    (
        SELECT DISTINCT
               name
        FROM eaters e1
        WHERE NOT EXISTS
        (
            SELECT * FROM eaters e2 WHERE e2.name = 'jack' AND e1.fruit = e2.fruit
        )
              AND e1.name = e.name
    );