Вы можете выполнить управляемый данными JOIN
с помощью одного запроса.По сути, вы должны JOIN
каждый необходимый подтаблицу, а затем, используя псевдонимы, выбрать содержимое из таблицы, которая вам нужна.Предполагая, что 1 - это action_drink, 2 - activity_eat, а 3 - activity_sports, и у всех подтаблиц есть столбец content
, который вы хотите получить:
SELECT a.`timestamp`,
CASE a.`activity_type`
WHEN 1 THEN ad.`content`
WHEN 2 THEN ae.`content`
WHEN 3 THEN asp.`content`
END AS content
FROM activities AS a
LEFT JOIN activity_drink AS ad ON (ad.`activity_id` = a.`activity_id`)
LEFT JOIN activity_eat AS ae ON (ae.`activity_id` = a.`activity_id`)
LEFT JOIN activity_sports AS asp ON (asp.`activity_id` = a.`activity_id`)
Это в основном приведет к денормализации ваших таблиц в выбранное время.Вы также можете преобразовать его в VIEW
для удобства доступа.Это не должно быть слишком дорого, при условии, что вы правильно настроили внешние ключи, идентификаторы и / или UNIQUE
индексы (MySQL не заметит совпадения строк в таблице и «проигнорирует это» - выбрав строку NULL).Я не проверил это должным образом, так как у меня нет никаких данных, и я должен был предположить, но фрагмент должен быть в основном функционирующим.
Однако я хотел бы отметить, что лично я опасаюсь делать этоуправляемые данными соединения.Правильный способ нормализации в этом случае - найти самый большой общий набор атрибутов и поместить их в таблицу activities
.При необходимости вы можете добавить дополнительную информацию в соседние таблицы.Однако, вообще говоря, если несколько таблиц используют одни и те же данные, вам, вероятно, следует переместить их в основной столбец, если в этом нет крайней необходимости.