#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. Да, я придурок. Теперь я понял… Спасибо. Допустим, я хотел сохранить результат этого запроса в виде представления…