我有一个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/