Как объединить таблицы на основе значения столбца в таблице

У меня есть стол 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 в листинге становится пустым. Что я хочу сделать, это:

  1. Если тип является компанией, то присоединиться к company таблица при выборе списка с условием для статуса как активный

  2. Если тип — пользователь, тогда ПРИСОЕДИНЯЙТЕСЬ к user таблица при выборе списка с условием для статуса как активный

0

Решение

Ну, вы можете использовать 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);
0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]