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