【问题标题】:How to join tables based on the column value in a table如何根据表中的列值连接表
【发布时间】:2014-10-04 05:23:05
【问题描述】:

我有一个表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. 的列表
  3. 如果类型是用户,则加入user 表,同时选择状态为活动

  4. 的列表

【问题讨论】:

  • 您想在一个查询中完成所有这些操作吗?
  • @isim 是的,因为我需要使用分页进行列表。我可以检查每条记录,但在这种情况下分页会中断

标签: php mysql join


【解决方案1】:

这个问题你可以使用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 将创建没有此类索引的表,但请记住它会跳过重复的数据。

但更优化的方法是使用INNER JOIN 在 MySQL 中执行 Conditional 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);

【讨论】:

  • @Gautam3164:这应该有帮助,请检查。
猜你喜欢
  • 1970-01-01
  • 2013-08-08
  • 2021-01-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多