2016-12-12 7 views
-2

У меня есть эти таблицы:GROUP_CONCAT на две колонки

партии

id | date | place 

Party_Attendands

id | party_id | person_id | unknow_person_id 

Лица

id | name | lastname 

Я хочу денормализовать некоторые данные и избегать использования Party_Attendands. В основном я хочу вид, как

партии & PartyPeople

id | date  | place | attendands_list 
0 | 01/01/2016 | NY | 1,2,3,4 

Запрос ниже возвращает person_ids, но не unknow_person_ids. Люди, которые разбили вечеринку, тоже люди :). Если неясно, unknow_person_ids являются только идентификаторами, которые являются не в Persons. Таким образом, каждый ряд Party_Attendands содержит person_id или unknow_person_id, но не оба.

Таким образом, attendands_list должен содержать person_ids и unknow_person_ids, в настоящее время обрабатывает только первые.

SELECT party.party_id, party.date, attendands.list 
FROM party 
LEFT OUTER JOIN 
(
    SELECT party_id , GROUP_CONCAT(Party_Attendands.person_id 
    ORDER BY person_id 
    SEPARATOR ',') AS list 
    FROM Party_Attendands 
    GROUP BY Party_Attendands.party_id 
) AS attendands 
ON party.party_id = attendands.party_id 
+1

Нет сомнений ... – Shadow

+0

Значения 'person_id' и ваши значения' unknown_person_id' взяты из одной и той же последовательности чисел? Может ли человек иметь такое же значение id, как у другого Неизвестного? –

+0

Нет, нет возможности иметь неоднозначные данные. ('unknown_person_id' начинается с 1000,' person_id' заканчивается около 300) – alfredopacino

ответ

0

TL; DR Использовать UNION.

Вы можете взять объединение значений person_id и unknown_person_id, например.

   SELECT party_id, person_id 
        FROM Party_Attendands 
       UNION   
       SELECT party_id, unknown_person_id AS person_id 
        FROM Party_Attendands 

Затем вы можете сгруппировать эти элементы, как так:

SELECT party_id, 
      GROUP_CONCAT(DISTINCT person_id ORDER BY person_id) persons 
    FROM (
       SELECT party_id, person_id 
        FROM Party_Attendands 
       UNION   
       SELECT party_id, unknown_person_id AS person_id 
        FROM Party_Attendands 
     ) a 
    GROUP BY party_id 

Затем вы можете присоединиться к этому результату к вашей другой таблице.

SELECT p.id party_id, p.date, p.place, q.persons 
    FROM Party p 
    LEFT JOIN (
      SELECT party_id, 
        GROUP_CONCAT(DISTINCT person_id ORDER BY person_id) persons 
      FROM (
         SELECT party_id, person_id 
          FROM Party_Attendands 
         UNION   
         SELECT party_id, unknown_person_id 
          FROM Party_Attendands 
       ) a 
      GROUP BY party_id 
     ) q ON p.id = q.party_id 

Я полагаю, что это не вечеринка, если никто не появляется. Но все же, LEFT JOIN позволит вашему результирующему набору отображать строки из вашей таблицы Party, даже если в вашей другой таблице не отображаются соответствующие строки.

+0

Некоторые неудачные партии :), поэтому я использовал 'left external join'. Я пробовал ваш, и я не уверен, почему он все еще обрабатывает неудачную партию с простым «левым соединением». В любом случае, я сделал это, работая с двумя грубыми «левыми внешними соединениями», ваш лучше, и я буду использовать его. – alfredopacino

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