2016-02-05 3 views
1

У меня есть база данных, макет которой находится вне моего контроля, которая содержит два объекта: «Личность» и «Тит». Каждый человек может иметь несколько признаков, и каждый признак может быть связан с несколькими лицами. Там есть промежуточный объект для этого отношения:Присоединить элементы, которые не входят в группу

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

Один подход заключается, чтобы найти негативную группу по:

  1. получать перекрестный продукт p.id и t.id от человека и признака (все возможные комбинации лиц и признаков)
  2. вычитающих множество позитивов от перекрестного продукта

что остается множество всех пар 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 

Это работает для меня с пробными данными. Затем вы можете настроить объединение этого запроса с помощью существующего запроса.

+0

Это отлично работает, спасибо большое. Это было более очевидно, что я ожидал, но я не знал о КРОМЕ. – Kyte

Смежные вопросы