2014-10-04 3 views
0

У меня есть таблица 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

И вы хотите, чтобы сделать все это в одном запросе? –

+0

@isim да, потому что мне нужно сделать распечатку с помощью pagination.I может сделать проверку для каждой записи, но разбиение на страницы будет перерыв в этом случае – Gautam3164

ответ

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" 

Просто добавить, чтобы увеличить efiiciency использовать UNION ALL, а не UNION (или UNION DISTINCT), как UNION требует внутренней временной таблицы с индексом (для пропуска повторяющихся строк), а UNION ALL будет создавать таблицу без такого индекса, но имейте в виду, что он пропустит повторяющиеся данные.

Но более оптимизированный способ сделать в MySQL с Conditional Join помощью 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

@ Gautam3164: Это должно помочь, пожалуйста, проверьте. –

Смежные вопросы