Mysql 如果表2中存在所有值,则保留表1中的行

Mysql 如果表2中存在所有值,则保留表1中的行,mysql,sql,Mysql,Sql,构造此sql查询时遇到一些问题 我有一张加拿大和美国城市的桌子,如下所示: +-------------+------------------+ |start |finish | +-------------+------------------+ | Calgary| Vancouver| | Edmonton| Toronto| | Montreal| New York| |

构造此sql查询时遇到一些问题

我有一张加拿大和美国城市的桌子,如下所示:

+-------------+------------------+
|start        |finish            |
+-------------+------------------+
|      Calgary|         Vancouver|
|     Edmonton|           Toronto|
|     Montreal|          New York|
|      Chicago|          St Louis|
|        Miami|          Winnipeg|
+-------------+------------------+
我还有一张只有加拿大城市的桌子

+-------------+
|cities       |
+-------------+
|      Calgary|
|     Edmonton|
|     Montreal|
|    Vancouver|
|      Toronto|
|     Winnipeg|
+-------------+
我想过滤第一个表,只保留
start
finish
都存在于
cities
表中的行,如下所示:

样本输出:

+-------------+------------------+
|start        |finish            |
+-------------+------------------+
|      Calgary|         Vancouver|
|     Edmonton|           Toronto|
+-------------+------------------+
我最初的想法是:

SELECT *
FROM start_finish s, cities c
WHERE c.cities = s.start and c.cities = s.finish
但经过一些尝试和错误后,我意识到只有在开始和结束相同的情况下才会返回值

+-------------+------------------+
|start        |finish            |
+-------------+------------------+
|      Calgary|           Calgary|
+-------------+------------------+

任何帮助都将不胜感激

内部连接两次。一次用于
开始
,一次用于
完成

SELECT sf1.start,
       sf1.finish
       FROM start_finish sf1
            INNER JOIN cities c1
                       ON c1.cities = sf1.start
            INNER JOIN cities c2
                       ON c2.cities = sf1.finish;

内部连接两次。一次用于
开始
,一次用于
完成

SELECT sf1.start,
       sf1.finish
       FROM start_finish sf1
            INNER JOIN cities c1
                       ON c1.cities = sf1.start
            INNER JOIN cities c2
                       ON c2.cities = sf1.finish;

您可以使用
join
exists

select sf.*
from start_finish sf
where exists (select 1 from cities c where c.city = sf.start
             ) and
      exists (select 1 from cities c where c.city = sf.finish
             ) ;

您可以使用
join
exists

select sf.*
from start_finish sf
where exists (select 1 from cities c where c.city = sf.start
             ) and
      exists (select 1 from cities c where c.city = sf.finish
             ) ;

您正在使用c.cities=s.finish加入,因此它显然应该返回相同的行:)请添加预期输出的示例数据。这将有所帮助。您正在加入c.cities=s.finish,因此它显然应该返回相同的行:)请添加预期输出的示例数据。这会有帮助的。