У меня есть стол news_feed
в котором будут храниться все мои различные типы данных о деятельности, такие как действия администратора, действия пользователя, действия компании и т. д. Формат таблицы выглядит следующим образом:
news_id | type | admin_id | user_id | company_id
1 | admin | 2 | 3 | 0
2 | user | 3 | 4 | 1
3 | company | 0 | 1 | 2
Предположим, что пользователю с идентификатором 1 понравилась компания с идентификатором 2, тогда запись будет вставлена как
4 user 0 1 2
И я перечисляю их в моем модуле, и список идеален. Но предположим, что если идентификатор компании 2 не существует или он неактивен, то блок news_feed в листинге становится пустым. Что я хочу сделать, это:
Если тип является компанией, то присоединиться к company
таблица при выборе списка с условием для статуса как активный
Если тип — пользователь, тогда ПРИСОЕДИНЯЙТЕСЬ к user
таблица при выборе списка с условием для статуса как активный
Ну, вы можете использовать UNION
для этого вопроса
SELECT t.column1, t.column2, t.column3
FROM my_table t INNER JOIN company_table c
ON t.company_id = c.id
WHERE c.active=1 AND t.type = "company"UNION
SELECT column1, column2, column3
FROM my_table t INNER JOIN user_table u
ON t.user_id = u.id
WHERE c.active=1 AND t.type = "user"
Просто добавьте, чтобы повысить эффективность, используйте UNION ALL, а не UNION (или UNION DISTINCT), поскольку UNION требуется внутренняя временная таблица с индексом (для пропуска дублирующихся строк), в то время как UNION ALL создаст таблицу без такого индекса, но имейте в виду, что она будет пропущена повторные данные.
Но более оптимизированный способ сделать Conditional Join
в MySQL с помощью INNER JOIN
SELECT t.column1, t.column2, t.column3
FROM my_table t
INNER JOIN company_table c
ON (t.company_id = c.id AND t.type = "company" AND c.active=1)
INNER JOIN user_table u
ON (t.user_id = u.id AND t.type = "user" AND u.active=1);
Других решений пока нет …