Sqlite 连接不在组中的元素

Sqlite 连接不在组中的元素,sqlite,Sqlite,我有一个数据库,它的布局超出了我的控制,它包含两个实体,“Person”和“Trait”。每个人可能有多个特征,每个特征可能与多个人相关。此关系有一个中间实体: 到目前为止还不错。我想创建一个包含所有特征的列表,有特定特征的人和没有相同特征的人。积极因素很简单: SELECT t.id, t.name, positives.count, positives.members FROM Trait t JOIN ( SELECT t.id,

我有一个数据库,它的布局超出了我的控制,它包含两个实体,“Person”和“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;
然而,如何让消极的群体加入到我的队伍中来反对它,我却被难住了。有什么想法吗


如果有帮助的话,我可以发表意见。

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

  • 从person和trait(所有可能的person和trait组合)获得p.id和t.id的叉积
  • 从叉积中减去正数集
  • 剩下的是所有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 
    

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

    这非常有效,非常感谢。事实上,这比我预期的要明显得多,但我没有意识到。