2013-09-29 3 views
0

Я запрашиваю свою БД для извлечения некоторой информации из разных таблиц. Мне удалось получить приемлемый результат, который я, вероятно, мог бы использовать вне SQL. Результат, который я получил, очень неэффективен, и мне интересно, есть ли способ заставить SQL выполнять некоторую работу. В принципе, мне нужно более эффективно группировать данные и отбрасывать некоторые из них.SQL - «частичная» группа, различное поведение для разных столбцов

Мои текущие результаты запроса в таблице, которые могут быть упрощены следующим образом:

product_id | person_id | person_type | person_address | other_column 
     1 |  1001 |   1 | 999 Main St | info about product 1 
     1 |  1245 |   0 |    | info about product 1 
     1 |  5133 |   2 |  101 Sql St | info about product 1 
     1 |  9191 |   0 | 1 Query Ave | info about product 1 
     2 |  5451 |   1 | 40 Table Rd | info about product 2 
     2 |  6610 |   0 |    | info about product 2 

Я хотел бы GROUP BY product_id, но сохраняя отдельные person_id и person_address если person_type=0. Затем соедините адреса всех person_id, которые разделяют те же product_id. Держите только одно значение от other_column. Применительно к таблице выше, он должен выглядеть следующим образом:

product_id | person_id | person_address |      other_address | other_column 
     1 |  1245 |    | 999 Main St; 101 Sql St; 1 Query Ave | info about product 1 
     1 |  9191 | 1 Query Ave |    999 Main St; 101 Sql St | info about product 1 
     2 |  6610 |    |       40 Table Rd | info about product 2 

-

В качестве альтернативы, второй-лучшим решением было бы следующее: GROUP BY product_id, держать person_id, которые имеют person_type=0 и сцепить если более одной акции те же product_id, объедините person_address и сохраните только один other_column. Результат должен выглядеть следующим образом таблице:

product_id | person_id |      person_address | other_column 
     1 | 1245; 9191 | 999 Main St; 101 Sql St; 1 Query Ave | info about product 1 
     2 |  6610 |       40 Table Rd | info about product 2 

-

Чтобы дать некоторый фон, у меня есть 2 цели: первая состоит в извлечении other_column но отбрасывать ненужные дубликаты. Это текстовая информация настолько тяжелая. Вторая цель заключается в том, чтобы получить информация о местоположении для тех person_id, которые не имеют person_address.

(я попытался найти подобные вопросы, не нашли ничего.)

ответ

0
select 
    t1.product_id, t1.person_id, 
    t1.person_address, 
    group_concat(t2.person_address) as other_address 
from Table1 as t1 
    left outer join Table1 as t2 on 
     t2.product_id = t1.product_id and t2.person_id <> t1.person_id 
where t1.person_type = 0 
group by t1.product_id, t1.person_id 

sql fiddle demo

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