2012-11-25 77 views
2

希望有人能帮我解决这个问题。我有一个表以下数据:MySQL左连接返回错误的结果数

site_id type       key    data 
2  organic-keywords-last-month (not provided) 9064 
2  organic-keywords-last-month bmi    345 
2  organic-keywords-last-month bmi kalkulator 445 
2  organic-keywords-last-month grove pannekaker 678 
2  organic-keywords-last-month grove vafler  976 
2  organic-keywords-last-month lapper   475 
2  organic-keywords-last-month melk.no   624 
2  organic-keywords-last-month ostesuffle  361 
2  organic-keywords-last-month scones   697 
2  organic-keywords-last-month sunne pannekaker 658 
2  organic-keywords-last-month sunne vafler  484 
2  organic-keywords-this-month (not provided) 10034 
2  organic-keywords-this-month bmi kalkulator 659 
2  organic-keywords-this-month grove pannekaker 721 
2  organic-keywords-this-month grove vafler  857 
2  organic-keywords-this-month lapper   515 
2  organic-keywords-this-month melk.no   587 
2  organic-keywords-this-month ostesuffle  433 
2  organic-keywords-this-month scones   626 
2  organic-keywords-this-month smultringer  401 
2  organic-keywords-this-month sunne pannekaker 566 
2  organic-keywords-this-month sunne vafler  407 

我想要做的就是查询所有的有机 - 关键词这个月,离开他们加入到有机 - 关键词最后一个月,所以这我从本月获得了11个关键词的列表,他们的表现以及他们上个月的表现。

我使用下面的查询:

SELECT 
    ktm.key AS keyword, 
    ktm.data AS `this month`, 
    klm.data AS `last month` 
FROM 
    data AS ktm 
    LEFT JOIN data AS klm ON 
     (ktm.key = klm.key AND ktm.type = 'organic-keywords-this-month' 
     AND klm.type = 'organic-keywords-last-month') 
WHERE 
    ktm.site_id = 2 
    AND klm.site_id = 2 
ORDER BY 
    `this month` ASC 

我想这应该返回11行,因为有11个行类型的“有机 - 关键词这一个月”,但当我只能运行它,它返回10行,看起来更像是内部连接表而不是左连接。

任何人有任何想法?

回答

2

我想查询是非常接近......但把你的类型的连接条件太是相同的,只有放预选赛的类型与此个月的数据相关联的WHERE子句中

SELECT 
     ktm.key AS keyword, 
     ktm.data AS this_month, 
     klm.data AS last_month 
    FROM 
     data AS ktm 
     LEFT JOIN data AS klm 
      ON klm.site_id = ktm.site_id 
      AND klm.key = ktm.key 
      AND klm.type = 'organic-keywords-last-month' 
    WHERE 
      ktm.site_id = 2 
     AND ktm.type = 'organic-keywords-this-month' 
    ORDER BY 
    this_month ASC 

通过应用“AND ktm.type ='organic ...',这将适当地限定你现在需要的东西

但是,LEFT JOIN也将基于”AND ktm.type = klm.type “通知我调整为同样适用于上个月的”同一站点ID“

我会确保数据表有一个索引(site_id,类型,键)

+0

@ypercube,感谢上个月与本月关键字的修改。看来我不像晚上11点30分那样集中注意力:) – DRapp

+0

这似乎是诀窍,谢谢你! – Mattamatic

1

您的WHERE需要klm的特定值,因此查询没有返回您的第11行,甚至没有任何klm值。

将klm的一半放在WHERE中,并将它放在左连接中。

+0

感谢您的回应!我明白你的意思,但我似乎仍然无法完成工作。我试过如下: 选择 ktm.key AS关键字, ktm.data AS'这个month', klm.data AS'最后month' FROM 数据AS KTM LEFT JOIN AS荷航方面的数据 (KTM .key = klm.key和ktm。type ='organic-keywords-this-month' AND klm.type ='organic-keywords-last-month'AND klm.site_id = 2) WHERE ktm.site_id = 2 ORDER BY 'this month' ASC 现在它返回一堆既没有指定类型的行。有任何想法吗? – Mattamatic

+0

将ktm.type =位移至WHERE。 –

0

如果你把你的表分成两个表,一个为本月,一个为上个月,你会注意到一个轻微关键列中的差异。最近一个月的小组有一个名为'bmi'的关键字,这个月没有这个关键字,而这个月有一个关键字叫'smultringer',这个关键字在上个月没有。由于缺少匹配,您在klm.key = ktm.key中指定的那些行将被排除在联接之外,因此您只有10行而不是11.

编辑:我并不是说实际上将表分开,我的意思是要做到这一点,比较各组。

+0

虽然不是左连接点吗?要包含左侧表中的所有记录,并且只包含右侧匹配的记录? – Mattamatic

1

就像Paul Gregory说的那样。我认为这应该被接受为答案。我只是补充说,如果并且仅当您想要将键值与来自同一站点的键值进行比较时,应该在联接'on'子句内比较站点值。在任何一种情况下,如果你想限制结果到ktm.site = 2,那么可以在join on子句中使用,也可以使用ktm.site = klm.site或where子句,只要不要把klm在where子句中的.site。