Улучшите этот запрос для извлечения данных из разных таблиц

Это мой сценарий. У меня есть таблица событий с типом поля со значениями 1 = еда, 2 = рецепт. Упрощение, моя таблица событий имеет следующую структуру:

id | entity_id | user_id | type | timestamp | field1 | ... field n

Поле "entity_id" относится к уникальной автоинкрементной стоимости из таблицы "Сущности". Структура таблицы продуктов и рецептов очень похожа: поля entity_id и user_id.

Я хочу получить все общие данные из событий таблицы из последних 10 регистров и получить некоторые необходимые поля соответствующей таблицы на основе значения типа событий таблицы. К настоящему времени я достиг некоторых довольно похожих, но не совсем то, что хочу, с помощью этого запроса:

SELECT a.*, b.name, b.field1, b.field2, c.name, c.field1, c.field2
FROM events a
LEFT JOIN foods b ON b.entity_id = a.entity_id
LEFT JOIN recipes c ON c.entity_id = a.entity_id
ORDER BY timestamp DESC LIMIT 10

Это всегда возвращает все поля для всех таблиц, с значениями NULL, когда поле не относится к типу этого конкретного регистра. Поэтому я хочу получить все поля таблицы событий и имя, поле1, поле2 соответствующей таблицы.

РЕДАКТИРОВАТЬ:

Вот sqlfiddle sqlfiddle.com/#!2/18d45/9 Я бы хотел, чтобы запрос возвращал разные значения полей на основе таблицы. В примере таблицы рецепты имеют поле описания, а продукты - нет. Является ли это возможным?

Пожалуйста, помоги мне с этим!

1 ответ

Вы можете использовать COALESCE, чтобы получить первый столбец не NULL:

SELECT a.*, COALESCE(b.name, c.name), COALESCE(b.field1, c.field1), COALESCE(b.field2, c.field2)
FROM events a
...

licensed under cc by-sa 3.0 with attribution.