加入不在组

时间:2016-02-05 00:54:54

标签: sqlite

我有一个数据库,其布局不受我的控制,其中包含两个实体,“人物”和“特征”。每个人可以具有多个特征,并且每个特征可以与多个人相关联。这种关系有一个中间实体:

Person <->> Person_Trait <<-> Trait

到目前为止一切顺利。我想创建一个列表,其中包含所有特征,具有特定特征的人员以及具有相同特征的人员。积极的事情很简单:

SELECT t.id,
   t.name,
   positives.count,
   positives.members
FROM Trait t
   JOIN (
       SELECT t.id,
              count() AS count,
              group_concat(p.name) AS members
         FROM Person p
              JOIN Person_Trait pt ON pt.id_person = p.Id
              JOIN Trait t ON t.id = p.id_trait
        GROUP BY t.id
   )
   AS positives ON t.id = positives.id;

然而,我很难理解如何让负面群体加入反对它。有什么想法吗?

如果可能有所帮助,我可以发表意见。

1 个答案:

答案 0 :(得分:1)

一种方法是通过以下方式找到负面组:

  1. 从人和特征中获取p.id和t.id的交叉产物(人和特征的所有可能组合)
  2. 从交叉产品中减去一组正数
  3. 剩下的是所有p.id/t.id对的集合是否定的

    然后,您可以执行类似于您拥有的查询。

    因此,获取完整负片集的查询将是:

    SELECT p.id AS p_id, t.id AS t_id
    FROM person p, trait t
    EXCEPT
    SELECT pt.id_person, pt.id_trait
    FROM person_trait pt
    

    然后你可以将它作为子查询加入到其他表中来获取名称:

    SELECT q1.t_id, t.name, COUNT() AS negcount, GROUP_CONCAT(p.name) AS negmem
    FROM 
        (SELECT p.id AS p_id, t.id AS t_id
            FROM person p, trait t
         EXCEPT
         SELECT pt.id_person, pt.id_trait
            FROM person_trait pt) q1
    JOIN trait t ON t.id = q1.t_id
    JOIN person p ON p.id = q1.p_id
    GROUP BY t_id 
    

    这适用于我的试用数据。然后,您可以设置将此查询与现有的正面查询相结合。