我有一个数据库,其布局不受我的控制,其中包含两个实体,“人物”和“特征”。每个人可以具有多个特征,并且每个特征可以与多个人相关联。这种关系有一个中间实体:
到目前为止一切顺利。我想创建一个列表,其中包含所有特征,具有特定特征的人员以及不具有相同特征的人员。积极的事情很简单:
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;
然而,我很难理解如何让负面群体加入反对它。有什么想法吗?
如果可能有所帮助,我可以发表意见。
答案 0 :(得分:1)
一种方法是通过以下方式找到负面组:
剩下的是所有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
这适用于我的试用数据。然后,您可以设置将此查询与现有的正面查询相结合。