我可以在加入之前选择吗?

时间:2010-12-11 09:22:59

标签: mysql select join null left-join

我想left join两张桌子。我的问题是数据库中不存在“正确”的表。我需要在查询期间创建它。更详细地说,“右”表是通过从现有表中提取(select ... where ...)某些行来获得的。

我认为解决方案首先是join,然后是select。我认为它会比electjoin慢,但我意识到它根本不起作用。

例如:

左表:

| Dog | 1 |
| Cat | 0 |

右表:

| Dog | Paul | yes |
| Cat | Carin | no |

我想只使用第二列中第二列有“Carin”的那些行。所以,如果我在选择那些行后加入:

| Dog | 1 | Null | Null|
| Cat | 0 | Carin | no |

但如果我第一次加入,我会:

| Dog | 1 | Paul | yes |
| Cat | 0 | Carin | no |

然后,如果我选择Carin行,我会得到:

| Cat | 0 | Carin | no |

所以,你看到结果是不同的。在第一种情况下,我得到2行,在第二种情况下,我只得到1行。

那么,是否可以在加入前选择?

3 个答案:

答案 0 :(得分:2)

我认为你在谈论引用在定义为join语句一部分的子查询中创建的字段。像这样:

SELECT a.id, b.name 
   FROM table AS a
   LEFT JOIN
     (SELECT name FROM table2) AS b
   ON a.id = b.id

在此,您引用了b.name,即使b.name仅作为稍后在查询中创建的子查询的一部分存在。

如果这是你的意思,那么你绝对可以做到这一点。如果你不能,就没有理由加入子查询。

如果我误解了您的意图,请将您想要运行的实际查询添加到您的问题中,以便我更清楚地看到问题。

答案 1 :(得分:1)

您也可以加入常量。基本上,您将WHERE子句中的表达式移动到ON子句:

SELECT a.pet, a.neutered, b.name, b.allergic
  FROM a
  LEFT JOIN b
    ON a.pet=b.pet AND b.name='Carin';

答案 2 :(得分:0)

Outis的例子对我不起作用,但是当我用WH替换AND时,这个有效。

SELECT a.pet, a.neutered, b.name, b.allergic
  FROM a
  LEFT JOIN b
    ON a.pet=b.pet WHERE b.name='Carin';