将多个连接组合成一个连接?

时间:2010-10-19 16:41:06

标签: mysql join

有两个表 - incoming tours(id,name)incoming_tours_cities(id_parrent, id_city),其中id_parrent是来自第一个表的ID。

这是我写的查询

SELECT t.cities
FROM `incoming_tours` t
JOIN `incoming_tours_cities` tc0 ON tc0.id_parrent = t.id
AND tc0.id_city = '1'
JOIN `incoming_tours_cities` tc1 ON tc1.id_parrent = t.id
AND tc1.id_city = '6'

现在,问题是什么......

为什么我不能在单个连接中写两个条件?(即我可以,但它返回空结果。)

据我所知加入,当我写作

JOIN incoming_tours_cities tc ON tc.id_parrent = t.id

它必须返回条件为true的行列表。不是吗?

为什么我不能写

SELECT t.cities
FROM `incoming_tours` t
JOIN `incoming_tours_cities` tc ON tc.id_parrent = t.id
AND tc.id_city = '1'
AND tc.id_city = '6'

也许有更有效的方法来丰富相同的效果(因为在我的结构中,条件的数量可能非常大)

非常感谢

3 个答案:

答案 0 :(得分:0)

tc.id_city的值不能同时为'1'和'6'。我想你想要一个OR而不是AND:

SELECT t.cities 
FROM `incoming_tours` t 
JOIN `incoming_tours_cities` tc ON tc.id_parrent = t.id 
AND (tc.id_city = '1' 
OR tc.id_city = '6') 

答案 1 :(得分:0)

这样想。如果你要求来自incoming_tour_cities的id_city值为'1'并且同时'6'的行,你会匹配多少行?

你真正想要的是:

 SELECT t.cities
 FROM `incoming_tours` t
 JOIN `incoming_tours_cities` tc ON tc.id_parrent = t.id
 WHERE (tc.id_city = '1'  OR  tc.id_city = '6')

或更紧凑:

 SELECT t.cities
 FROM `incoming_tours` t
 JOIN `incoming_tours_cities` tc ON tc.id_parrent = t.id
 WHERE tc.id_city IN ('1', '6')

答案 2 :(得分:0)

基于用户澄清第一个查询是他想要复制的查询的替代答案。

这是我所知道的唯一“捷径”方式,其中“捷径”意味着不执行两次独立测试(使用JOIN或EXISTs条款):

 SELECT t.cities
  FROM `incoming_tours` t
  JOIN `incoming_tours_cities` tc ON tc.id_parrent = t.id
  WHERE tc.id_city IN ('1', '6')
  GROUP BY t.cities HAVING COUNT(DISTINCT tc.id_city) > 2