2014-10-04 72 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  

假设一个id 1用户已经喜欢具有ID 2,那么该记录将被插入像

4  user  0   1   2 

公司与我列出这些我模块和上市是完美的。但是,假设公司ID 2不存在或者它不活动,则列表中的news_feed块变空。我想要做的是:

  1. 如果类型为公司再加入company表,同时与条件状况选择上市作为活跃

  2. 如果类型用户再加入user表而与条件状况选择上市作为活跃

+0

做MySQL中的Conditional Join你想要做的所有这些在一个查询? – 2014-10-04 05:31:23

+0

@isim是因为我需要做pagination.I上市可以做检查对于每个记录,但分页将突破在这种情况下 – Gautam3164 2014-10-04 05:32:18

回答

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将创建表没有这样的索引,但要记住它会跳过重复的数据。

但更优化的方式使用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:这应该帮助,请检查。 – 2014-10-04 12:17:20

相关问题