0

我有一张如下表。

id        | city1   | city2       | distance
----------+---------+-------------+-----------
1         | Jane B  | japan       | 8
2         | Joe A   | florida     | 11 
3         | Joe F   | california  | 215 
4         | Jane A  | ghana       | 3
5         | Jane B  | florida     | 8
6         | Joe C   | jakarta     | 11 
7         | Joe F   | california  | 215 
8         | Joe A   | japan       | 3

假设如果我想为 jow A 和 jane B 找到共同的 city2,我如何在 mysql 中检索它。(在这种情况下,结果将是 japan 和 florida)。如果我从 city1 列提供两个值,结果出来为如果列 city2 中存在,则为两者的共同值。

4

4 回答 4

2

你可以这样做:

select city2
from t
group by city2
having sum(city1 = 'Joe A') > 1 and
       sum(city1 = 'Jane B') > 1;
于 2013-08-22T01:25:24.223 回答
1
Select a.ID, a.City1, a.City2, a.distance
FROM table A
INNER JOIN table B on A.City2 = B.City2
AND A.City1 = 'JANE B' and B.City1 = 'Joe A'

这里的目的是在两个 City2 值之间的城市名称上执行自连接,以便返回所有类似的城市,但前提是 city1 和 city2 是感兴趣的值。

所以使用提供的数据

  • 日本将把 Joe A 和 Jane B 映射到日本,并且由于限制标准而被保留
  • 对于乔 A 和简 B,佛罗里达州将映射到佛罗里达州,并且由于限制标准而被保留
  • 加利福尼亚将映射到加利福尼亚……但由于不满足 Jane B 和 Joe A 的限制标准,它将被排除在结果之外。

此方法使您能够从表中为 City1 的任一值(Jane B 或 Joe A)返回任何值,而不仅仅是一个城市。

它对自身使用内部连接的方法,该方法表示注释中隐含的集合的交集。

于 2013-08-22T01:26:21.450 回答
1

对于您的示例,您可以通过以下方式获得结果:

 SELECT city2 
 FROM table
 WHERE city1 = "Joe A" or city1 = "Jane B"
 group by city2
 Having count(city1)>=2
于 2013-08-22T01:27:35.540 回答
0

根据您的数据分布,子查询可能会有所帮助或至少看起来更干净。

select A.city2
from 
(
    select distinct city2
    from t
    where t.city1 = 'Joe A'
) A
inner join 
(
    select distinct city2
    from t
    where t.city1 = 'Jane B'
) B
on A.city2 = B.city2
于 2013-08-22T01:49:41.060 回答