如何使用MYSQL交叉多个查询?

时间:2016-10-07 18:19:51

标签: mysql

我正试图与这些查询相交。我将从两个相交的查询到五个相交的查询。

select * from Main
left join title_keyword_link on Main.id = title_keyword_link.title_id
left join keywords_master on title_keyword_link.keyword_id = keywords_master.id
where keywords_master.keyword = 'opinion'

INTERSECT 

select * from Main
left join title_keyword_link on Main.id = title_keyword_link.title_id
left join keywords_master on title_keyword_link.keyword_id = keywords_master.id
where keywords_master.keyword = 'sports'

我发现MYSQL不支持INTERSECT,所以我尝试了一些建议的替代方案。我试过了:

select * from Main
left join title_keyword_link on Main.id = title_keyword_link.title_id
left join keywords_master on title_keyword_link.keyword_id = keywords_master.id
where keywords_master.keyword in ( 'opinion', 'sports')

^这显示的结果看起来更像是意见和体育联盟

我也尝试过:

select keywords from Main
left join title_keyword_link on Main.id = title_keyword_link.title_id
left join keywords_master on title_keyword_link.keyword_id = keywords_master.id
where keywords_master.keyword = 'sports'
and keywords_master.keyword  in (select keywords from Main
    left join title_keyword_link on Main.id = title_keyword_link.title_id
    left join keywords_master on title_keyword_link.keyword_id = keywords_master.id
    where keywords_master.keyword = 'opinion')

^此代码导致MySQL Workbench崩溃。

3 个答案:

答案 0 :(得分:1)

我认为您可以在两个结果表之间使用内部联接

  select * from (

select Main.id from Main
left join title_keyword_link on Main.id = title_keyword_link.title_id
left join keywords_master on title_keyword_link.keyword_id = keywords_master.id
where keywords_master.keyword = 'opinion'

  ) t1 
 inner join (
    select Main.id from Main
    left join title_keyword_link on Main.id = title_keyword_link.title_id
    left join keywords_master on title_keyword_link.keyword_id = keywords_master.id
    where keywords_master.keyword = 'sports'
  ) t2 on t1.id = t2.id

答案 1 :(得分:1)

要从Main获取与关键字“意见”和“体育”相关的行,我会使用如下查询:

  SELECT m.*
    FROM Main m
    JOIN ( SELECT k.title_id
             FROM title_keyword_link k
             JOIN keywords_master r
               ON r.id = k.keyword_id
            WHERE r.keyword IN ('opinion','sports')  -- specific keywords to search for
            GROUP BY k.title_id 
           HAVING COUNT(DISTINCT r.keyword) = 2      -- number of keywords to match
         ) s
      ON s.title_id = m.id                           -- only return rows that match

使用“EXISTS (correlated subquery)”模式可以获得等效结果:

  SELECT m.*
    FROM Main m
   WHERE EXISTS ( SELECT 1 
                    FROM title_keyword_link k1
                    JOIN keywords_master r1
                      ON r1.id = k1.keyword_id
                   WHERE r1.keyword = 'opinion' -- keyword 1 to search for 
                     AND k1.title_id = m.id     -- matches row in outer query
                )
     AND EXISTS ( SELECT 1 
                    FROM title_keyword_link k2
                    JOIN keywords_master r2
                      ON r2.id = k2.keyword_id
                   WHERE r2.keyword = 'sports'  -- keyword 2 to search for
                     AND k2.title_id = m.id     -- matches row in outer query
                )

这些示例查询将返回结果集,Main中与“意见”和“体育”关键字相关联的所有行。

但是这两个示例查询都没有回答被问到的问题:

问:“如何交叉多个查询”

A:可以在MySQL中获得两个(或更多)查询返回的结果的“交集”。在某些情况下,我们可以使用内联视图的INNER JOIN操作来模拟缺少的INTERSECT集合运算符。

对于问题中显示的特定查询,可以将 exact 查询用作内联视图,因为查询返回多个具有相同名称的列。 (问题的根源是select *Main表和keywords_master表都包含一个名为id的列。查询需要进行修改,以便它只返回不同的列名。)

我们还注意到在OP查询中,LEFT JOIN操作的“外部性”被WHERE子句中的谓词否定。从该查询返回的结果将等同于使用内部联接操作返回的结果。

答案 2 :(得分:-3)

相交,你的意思是笛卡儿积?

你想在哪里与桌子相交?

我想到LEFT JOIN,但你可能需要将LEFT JOIN与其他声明结合起来。

你能做子查询吗?您可能必须将子查询与LEFT JOIN组合。