【问题标题】:Combining two SELECT query that Do not Intersect结合两个不相交的 SELECT 查询
【发布时间】:2015-02-03 07:40:33
【问题描述】:

假设我们有三个表。表 2 和表 3 与表 1 相交,但彼此不相交。

两个单独的 INNER JOIN 查询获取表 1 & 2 和表 1 & 3 之间的公共列值。

现在我的问题是如何将这两个交叉点放在一起;简单地 INNER JOINing 这些表不会产生任何结果:

以下将是理想的结果。

这是我已经达到的理想结果,但还不够接近。

SELECT * FROM 
	(SELECT `tag_map`.`id`,`resource`.`resource_type_id`,`resource`.`title` FROM `tag_map`
        INNER JOIN `resource`
        ON `tag_map`.`tag_id` = '8'
            AND `tag_map`.`entity_type_id`= '1'
            AND `resource`.`id` = `tag_map`.`entity_id`) AS t1
INNER JOIN 
	(SELECT `name`,`location` FROM `tag_map`        
        INNER JOIN `userinfo`
        ON `tag_map`.`tag_id` = '8'
            AND `tag_map`.`entity_type_id`= '2'
            AND `userinfo`.`id` = `tag_map`.`entity_id`) AS t2

这个查询的问题是 JOIN 子句混合了行,我得到了这个

【问题讨论】:

  • 使用union 而不是join

标签: mysql inner-join intersection


【解决方案1】:

您只需从与其他两个相交的表开始查询,然后在它们上LEFT JOIN

SELECT r.resource_type_id, 
       r.title, 
       u.name 
FROM   tag_map t 
       LEFT JOIN userinfo u 
              ON t.entity_id = u.id 
                 AND t.entity_type_id = '1' 
       LEFT JOIN resource r 
              ON t.entity_id = r.id 
                 AND t.entity_type_id = '2' 
WHERE  ( u.id IS NOT NULL 
          OR r.id IS NOT NULL ) 
       AND t.entity_type_id IN ( '1', '2' ) 
       AND t.tag_id = '1'; 

【讨论】:

  • 刚刚编辑了小提琴以产生所需的结果。
  • 是的,我只是更改了一些数据,以便结果完全符合您的要求。查询没有改变。
猜你喜欢
  • 1970-01-01
  • 2011-09-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多