MySQL:如何根据列

时间:2015-06-24 20:39:08

标签: mysql sql-server join left-join

如果我有两张桌子加入,我会像这样编写最简单的查询:

SELECT *
FROM t1
LEFT JOIN t2 ON t1.id = t2.id

有些记录每个ID有多行,因为它们有多个雇主,所以t1看起来像这样:

ID         Name         Employer
12345      Jerry        Comedy Cellar
12345      Jerry        NBC
12348      Elaine       Pendant Publishing
12346      George       Real Estate
12346      George       Yankees
12346      George       NBC
12347      Kramer       Kramerica Industries

t2与相似的ID相关联,但有一些我希望看到的活动 - 因此上面是SELECT *。如果Employer列是" NBC"我不想要多行返回。 - 但其他一切都很好。

此处唯一重要的是t2小于t1,因为t1是每个人而t2仅来自进行特定活动的人 - 所以有些比赛不会从t2返回任何内容,但我仍然希望它们被退回,因此LEFT JOIN

如果我写这样的查询:

SELECT *
FROM t1
LEFT JOIN t2 ON t1.id = t2.id
WHERE Employer <> "NBC"

然后它完全删除了Jerry和George - 当我真正想要的只是不返回NBC行,而是返回与它们相关联的任何其他行。

如何在t1t2加入t1时编写查询以返回除NBC之外的每一行?理想的输出是来自t2的所有行,无论它们是否与JOIN的所有行匹配,除非使用&#34; NBC&#34;删除所有行。作为退货文件中的雇主。基本上这里的理想是将JOIN返回到它们适合的位置,但无论是否为#34; NBC&#34;删除整个行。作为雇主而不删除其他行。

我写的越多,似乎我应该在t1之前运行查询,以删除Date oldDate = ... Date currentDate = new Date(); long dt = currentDate.getTime() - oldDate.getTime(); 中有&#34; NBC&#34;的所有行。作为他们的雇主,然后运行正常的查询。

1 个答案:

答案 0 :(得分:2)

基本子集过滤

您可以通过扩展ON子句来过滤两个合并(已加入)子集中的任何一个。

SELECT    *
FROM      t1
LEFT JOIN t2
       ON t1.ID = t2.ID
      AND t2.Employer != 'NBC'

如果您现在获得了null个值,并且您不想要它们,那么您需要添加:

WHERE t2.Employer IS NOT NULL

扩展逻辑:

SELECT    *
FROM      t1
LEFT JOIN t2
       ON (t1.ID = t2.ID AND t2.Employer != 'NBC')
       OR (t2.ID = t2.ID AND t2.Employer IS NULL)

使用UNION

基本上,JOIN用于水平链接,UNION用于垂直链接数据集。

它合并到结果集:第一个没有NBC,第二个(基本上是OUTER JOIN),在t1中添加了不属于t2的每个人。

SELECT    *
FROM      t1
LEFT JOIN t2
       ON t1.ID = t2.ID
      AND t2.Employer != 'NBC'
UNION
SELECT    *
FROM      t1
LEFT JOIN t2
       ON t1.ID = t2.ID
      AND t2.Employer IS NULL

结果集中的字符串操作

如果您只想将NBC删除为字符串,则可以采用以下解决方法:

SELECT
    t1.*,
    IF (t2.Employer = 'NBC', NULL, t2.Employer) AS Employer
FROM t1
LEFT JOIN t2
    ON t1.id = t2.id

这基本上取代了"NBC"

NULL