2017-02-05 4 views
0

В принципе, у меня есть 3 таблицы, заголовки, провайдеры и provider_titles.При запросе отношений «многие ко многим» в SQL возвратите несколько соединений как массив в одиночной строке?

Допустим, они выглядят следующим образом:

| title_id |  title_name | 
|------------|----------------| 
| 1   |  San Andres | 
| 2   |Human Centipede | 
| 3   | Zoolander 2 | 
| 4   | Hot Pursuit | 

| provider_id| provider_name | 
|------------|----------------| 
| 1   |   Hulu | 
| 2   |  Netflix | 
| 3   | Amazon_Prime | 
| 4   |   HBO_GO | 

| provider_id|  title_id | 
|------------|----------------| 
| 1   |    1 | 
| 1   |    2 | 
| 2   |    1 | 
| 3   |    1 | 
| 3   |    3 | 
| 4   |    4 | 

Таким образом, очевидно, есть названия с несколькими поставщиками, да? Типичные многие из многих до сих пор.

Так что я делаю, чтобы запросить это с JOIN, как следующее:

SELECT * FROM provider_title JOIN provider ON provider_title.provider_id = provider.provider_id JOIN title ON title.title_id = provider_title.title_id WHERE provider.name IN ('Netflix', 'HBO_GO', 'Hulu', 'Amazon_Prime')

Хорошо, теперь к реальной проблеме. Я не хочу повторять названия имен, но мне нужны все поставщики, связанные с заголовком. Позвольте мне объяснить другой стол. Вот то, что я получаю обратно с текущим запросом, как:

| provider_id| provider_name | title_id | title_name | 
|------------|---------------|----------|---------------| 
| 1   |   Hulu |   1|San Andreas | 
| 1   |   Hulu |   2|Human Centipede| 
| 2   |  Netflix |   1|San Andreas | 
| 3   | Amazon_Prime |   1|San Andreas | 
| 3   | Amazon_prime |   3|Zoolander 2 | 
| 4   |  HBO_GO |   4|Hot Pursuit | 

Но то, что я действительно хочу, было бы что-то больше похоже на

| provider_id| provider_name    |title_id| title_name| 
|------------|-----------------------------|--------|-----------| 
| [1, 2, 3] |[Hulu, Netflix, Amazon_Prime]|  1|San Andreas| 

Значение Я хочу только различные названия назад, но я до сих пор хотите, чтобы у каждого ассоциированного поставщика. Это только можно выполнить запрос после SQL с логикой, итерации по возвращенным строкам?

+1

эти похожие вопросы могут помочь 'http://stackoverflow.com/questions/887628/convert-mul tiple-rows-into-one-with-comma-as-separator' 'http: // stackoverflow.com/questions/21760969/multiple-rows-to-one-comma-separated-value' – crowchirp

ответ

1

В зависимости от вашего механизма базы данных может быть функция агрегирования, чтобы помочь в достижении этого.

Например, this SQLfiddle демонстрирует Postgres array_agg функцию:

SELECT t.title_id, 
     t.title_name, 
     array_agg(p.provider_id), 
     array_agg(p.provider_name) 
FROM provider_title as pt 
     JOIN 
     provider as p 
     ON pt.provider_id = p.provider_id 
     JOIN title as t 
     ON t.title_id = pt.title_id 
GROUP BY t.title_id, 
     t.title_name 

Другие СУБД имеют эквиваленты. Например:

Если база данных не распространяется выше, вы можете Google " [Ваш механизм базы данных] агрегированная запятая с разделителем строки '

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