2014-08-12 2 views
0

Я пробовал найти что-то подобное, но безрезультатно ...Как сконденсировать столбцы, подобные этому?

Речь идет о системе таблиц для системы управления клиентами. В частности, мне нужно создать историю записей для каждого клиента.

Итак, у меня есть таблица 'клиентов' с колоннами customers.customer_ID, customers.lastname, customers.firstname, customers.postal_code, customers.city и customers.street;

и другой стол «ноты» с колоннами notes.note_ID, notes.customer_ID, notes.subject, notes.description и notes.entered_on

Теперь мне нужно создать третий поиск таблицы, которая конденсируется большая часть приведенной выше информации. Он имеет таблицы search.contact_ID, search.name, search.address и search.history. Это должно выглядеть следующим образом:

contacts: 
contact_ID | lastname | firstname | ... 
------------+-----------+-----------+----- 
1   | Doe  | John  | ... 
2   | Dane  | Jane  | ... 

note: 
note_ID | contact_ID | subject    | description   | entered_on 
--------+---------------+-----------------------+-----------------------+---------------- 
1  | 1    | call received   | John Doe called us to | 2014-05-03 
     |    |      | ask for an offer  | 
2  | 1    | offer made   | We called John Doe to | 2014-06-03 
     |    |      | submit our offer  | 
3  | 2    | advertisement call | We called Jane Dane to| 2014-06-03 
     |    |      | inform her of our  | 
     |    |      | latest offer   | 
4  | 1    | offer accepted  | John Doe called to | 2014-08-03 
     |    |      | accept our offer  | 

search: 
contact_ID | name  | address      | history 
------------+---------------+---------------------------------+------------------- 
1   | Doe, John  | 55 Main Street, 12345 Oldtown | 'On 2014-08-03 offer accepted: John Doe accepted our offer. 
      |    |         | On 2014-06-03 offer made: We called John Doe to submit our offer. 
      |    |         | On 2014-05-03 call received: John Doe called us to ask for an offer.' 
2   | Dane, Jane | 111 Wall Street, 67890 Newtown | 'On 2014-06-03 advertisement call: We called Jane Dane to submit our offer.' 

В то время как я могу справиться с большей частью остального, я понятия не имею, как генерировать информацию предыстории. Моя идея была следующей:

WHILE 
    customers.customer_ID = note.customer_ID 
    AND 
    note.entered_on = GREATEST(note.entered_on) 
DO 
    SET customers.note_history = CONCAT_WS(' | ', CONCAT_WS(': ',note.subject,note.description), customers.note_history); 

Но это не обязательно хронологически. Также как я могу преобразовать это в утверждение, совместимое с SELECT INTO, используемым для создания остальной части таблицы?

+0

Звучит так, будто вы хотите что-то сделать в MySQL, что должно быть сделано в самом приложении. – NDM

ответ

1

Похоже, случай для группы-By, наряду с GROUP_CONCAT

CREATE TABLE search (PRIMARY KEY(contact_ID)) 
    SELECT contact_ID, CONCAT(lastname,', ',firstname) AS name, address, 
    GROUP_CONCAT(CONCAT('On ',entered_on,' ',subject,': ',description) 
     ORDER BY note_ID SEPARATOR "\n") AS history 
    FROM contacts LEFT JOIN note USING (contact_ID) 
    GROUP BY contact_ID 

Если не хотите использовать CREATE TABLE .. SELECT ..., может сначала просто создать (или укоротить!) Таблицу, а затем использовать INSERT INTO ... SELECT ... вместо этого.

+0

при ближайшем рассмотрении, см. У вас нет столбца адреса, его нужно будет скомпоновать. Но пример для имени, показывает, используя функцию CONCAT, чтобы сделать это. – barryhunter

+0

Спасибо, что вы работали при использовании 'ORDER BY imported_on', чтобы убедиться, что у меня есть хронологический порядок группировки. – JLN

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