我正试图与这些查询相交。我将从两个相交的查询到五个相交的查询。
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崩溃。
答案 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组合。