2016-09-08 1 views
1

У меня действительно большая модель со многими отношениями «многие-многие». Я создаю представление, используя множество таблиц для лучшего результата поиска, но все равно не могу загрузить в одном поле все значения в сводной таблице.Создайте представление со всеми значениями из сводной таблицы в одном поле в MySQL

Что у меня есть:

CREATE OR REPLACE VIEW westates AS 
     SELECT 
      concat(estates.locale,estates.id) as code, 
      cities.name as city, 
      councils.name as council, 
      states.name as state, 
      countries.name as country, 
      concat(cities.name,' (',councils.name,')') as city_council, 
      estates.* 

     FROM estates 
      JOIN countries ON (estates.country_id = countries.id) 
      JOIN states  ON (estates.state_id = states.id) 
      JOIN councils ON (estates.city_council_id = councils.id) 
      JOIN cities  ON (estates.city_id = cities.id) 

То, что я хочу (в псевдокоде)

CREATE OR REPLACE VIEW westates AS 
     SELECT 
      concat(estates.locale,estates.id) as code, 
      cities.name as city, 
      councils.name as council, 
      states.name as state, 
      countries.name as country, 
      concat(cities.name,' (',councils.name,')') as city_council, 
      estates.* 
      (SELECT all istallations from installations) as installations //and get all values from pivot table 

     FROM estates 
      JOIN countries ON (estates.country_id = countries.id) 
      JOIN states  ON (estates.state_id = states.id) 
      JOIN councils ON (estates.city_council_id = councils.id) 
      JOIN cities  ON (estates.city_id = cities.id) 
      JOIN estates_intallations ON (estates.id = estates_installations.estate_id) // this is the pivot table 

И получить в поле "установки" все идентификаторы в любом формате:

instatallations может быть содержание :

instatallations => "1 4 7 15" или "[1,4,7,15]" и т. Д.

Я могу сделать это с PHP, но мне нужно использовать один запрос, чтобы избежать использования тысяч запросов для создания этого представления.

(На вопрос недавно, но, возможно, что делает его incomprensible)

ответ

1

Заменить подзапрос с

(SELECT GROUP_CONCAT(inst_num) 
     FROM installations AS i 
     WHERE i... = ...) AS installations 

Для inst_num использования любого столбец дает вам 1,4 и т.д.
Для i...=... использовать любое состояние связь ` установки в другую таблицу (ы).

(И вам не хватает запятой.)

0

Благодаря Рик Джеймс. Для любого, у кого такая же проблема (небольшой опыт работы с SQL), я хочу завершить ответ. Представьте себе, что у нас есть столы, главный стол Estates и сводная таблица с некоторыми дополнениями, названными estates_extras.

table estates 
columns id, address 

table estates_extras 
columns estate_id, extra_id 

Мы хотим, чтобы вид, что есть:

table westates 
columns estates.id, estates.address, extras 
like 
    id  address   extras 
    25000 My nice road 1,5,8 

Прежде всего: Если мы не включаем DISTINCT мы будем иметь на наш взгляд, такое же количество столбцов повторными, так как элементы имеют в статистов в этом примере (с тремя статистов):

results 
    id  address   extras 
    25000 My nice road 1,5,8 
    25000 My nice road 1,5,8 
    25000 My nice road 1,5,8 

И если мы не добавляем JOIN, как LEFT JOIN мы не имеем никаких сословий, которые не имеют почти один дополнительный. Таким образом, с этим запросом у нас будут все наши Усадьбы, и если у них есть дополнения, их список будет разделен запятыми.

CREATE OR REPLACE VIEW westates AS 
    SELECT DISTINCT 
     estates.id, 
     estates.address, 
     (SELECT GROUP_CONCAT(estates_extras.extras_id) FROM estates_extras 
     WHERE estates_extras.estate_id = estates.id) AS extras 
    FROM estates 
    LEFT JOIN estates_extras ON (estates_extras.estates_id = estates.id)