如何根据表中的列值连接表

时间:2014-10-04 05:23:06

标签: php mysql join

我有表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表格,同时选择列表,状态为有效

1 个答案:

答案 0 :(得分: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);