Запрос таблицы объединения с полями в виде столбцов
-
09-06-2019 - |
Вопрос
Я не совсем уверен, возможно ли это или относится к категории сводных таблиц, но я решил обратиться к профессионалам, чтобы посмотреть.
У меня есть три основные таблицы:Карточка, Имущество и CardProperty.Поскольку карточки не имеют одинаковых свойств и часто имеют несколько значений для одного и того же свойства, я решил использовать подход union table для хранения данных вместо того, чтобы иметь действительно большую структуру столбцов в моей карточной таблице.
Таблица свойств - это базовая таблица типов ключевых слов / значений.Итак, у вас есть ключевое слово ATK и присвоенное ему значение.Существует еще одно свойство, называемое SpecialType, для которого карта может иметь несколько значений, таких как "Sycnro" и "DARK".
Что я хотел бы сделать, так это создать представление или хранимую процедуру, которая дает мне идентификатор карты, имя карты и все ключевые слова свойств, назначенные карте в виде столбцов, и их значения в результирующем наборе для указанной карты.Поэтому в идеале у меня был бы результирующий набор, подобный:
ID NAME SPECIALTYPE
1 Red Dragon Archfiend Synchro
1 Red Dragon Archfiend DARK
1 Red Dragon Archfiend Effect
и я мог бы подсчитать свои результаты таким образом.
Я думаю, еще проще было бы просто объединить свойства вместе на основе их ключевого слова, чтобы я мог сгенерировать результирующий набор типа:
1 Red Dragon Archfiend Synchro/DARK/Effect
.но я не знаю, возможно ли это.
Помоги мне stackoverflow Кеноби!Ты - моя единственная надежда.
Решение
Другие советы
Связанные, но значения - это значения, которые хранятся в отдельных столбцах, и вы уже давно знаете свои "особые типы":
SQL-запрос для сравнения продаж товара по месяцам
В противном случае я бы сделал это с помощью курсора в хранимой процедуре или предварительно выполнил преобразование на бизнес-уровне или уровне презентации.
Используйте sql, если вы знаете все случаи:
Select
ID,NAME
,Synchro+DARK+Effect -- add a some substring logic to trim any trailing /'s
from
(select
ID
,NAME
--may need to replace max() with min().
,MAX(CASE SPECIALTYPE WHEN "Synchro" THEN SPECIALTYPE +"/" ELSE "" END) Synchro
,MAX(CASE SPECIALTYPE WHEN "DARK" THEN SPECIALTYPE +"/" ELSE "" END) DARK
,MAX(CASE SPECIALTYPE WHEN "Effect" THEN SPECIALTYPE ELSE "" END) Effect
from
table
group by
ID
,NAME) sub1
Не сворачивайте с помощью конкатенации для хранения связанных записей в вашей базе данных.Это не совсем лучшая практика.
То, что вы описываете, - это сводная таблица.Сводные таблицы - это жесткий.Я бы посоветовал избегать их, если это вообще возможно.
Почему бы просто не прочитать связанные строки и не обработать их в памяти?Не похоже, что вы собираетесь потратить на это слишком много миллисекунд...
Один из вариантов заключается в том, чтобы свойства имели PropertyType, так что:
table cards
integer ID | string name | ... (other properties common to all Cards)
table property_types
integer ID | string name | string format | ... (possibly validations)
table properties
integer ID | integer property_type_id | string name | string value
foreign key property_type_id references property_types.ID
table cards_properties
integer ID | integer card_id | integer property_id
foreign key card_id references cards.ID
foreign key property_id references propertiess.ID
Таким образом, когда вы хотите задать новое значение свойства, вы можете проверить его по его типу.Одним из типов может быть "SpecialType" с перечислением значений.
У меня есть тип / формат для моей таблицы свойств, таким образом, я знаю, как приводить / оценивать, когда я имею дело с целочисленным значением.Я не был уверен, имеет ли это отношение к данному вопросу или нет.