如何基于一个表中的列值连接表
问题描述:
我在我的所有不同类型的活动数据将被存储管理员一样的活动,用户活动,公司活动等表格式如下表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"
我想补充,增加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
做MySQL中的
Conditional Join
你想要做的所有这些在一个查询? – 2014-10-04 05:31:23@isim是因为我需要做pagination.I上市可以做检查对于每个记录,但分页将突破在这种情况下 – Gautam3164 2014-10-04 05:32:18