запрос mysql для построения трех таблиц в матрицу

#mysql

#mysql

Вопрос:

Хорошо, это заставляет мой мозг болеть:

У меня есть три таблицы. Equipment , Site , и Permissions . Мастер оборудования, мастер сайта и список того, какое оборудование доступно на каком сайте.

Оборудование: EquipId, Описание сайта: SiteID, Название сайта EquipPerm: SiteID, EquipId

Мне нужно сгенерировать сетку из этих трех в одном операторе SQL:

Если EquipPerm содержит соответствующие SiteID и EquipId, тогда True:

 EquipPerm1 | SiteId1 | EquipId1 |
EquipPerm2 | SiteId1 | EquipId2 |
EquipPerm3 | SiteId2 | EquipId2 |
EquipPerm4 | SiteId3 | EquipId3 |
EquipPerm5 | SiteId2 | EquipId4 |
  

Требуемый SQL приведет к следующему:

 |  Equipment | SiteId1 | SiteId2  | SiteId3 |
|- EquipId1 -|- true --|- false --|- false -|
|- EquipId2 -|- true --|- true ---|- false -|
|- EquipId3 -|- false -|- false --|- true --|
|- EquipId4 -|- false -|- true ---|- false -|
  

Ответ №1:

Используйте подготовленный оператор для динамического построения запроса.

 set @sql = null;

select group_concat(distinct concat('sum(if(a.siteid="',siteid,'",1,0))>0 `',siteid,'`')) 
from equipment_site
into @sql;

set @sql = concat('select a.equipid, ', @sql, '
                   from equipment_site a 
                   group by a.equipid');

prepare st from @sql;
execute st;
deallocate prepare st;
  

скрипка

Комментарии:

1. Спасибо за ответ. Что происходит при добавлении site4? Я не хочу обновлять инструкцию SQL каждый раз, когда сайт добавляется в мастер.

2. Да, я придурок. Теперь я понял… Спасибо. Допустим, я хотел сохранить результат этого запроса в виде представления…