我有一个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块将为空。我想做的是:


如果类型是公司,则联接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);

关于php - 如何基于表中的列值联接表,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26189944/

10-15 18:28