2

希望有人可以帮助我解决这个问题。我有一个包含以下数据的表:

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 行类型为 'organic-keywords-this-month',但是当我运行它时它只返回 10 行,看起来更像是内部连接表而不是左连接.

有人有想法么?

4

4 回答 4

2

我认为查询非常接近......但是将您的连接条件放在相同的类型上,并且只将类型的 QUALIFIER 放在与 THIS MONTHs 数据关联的 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, type, key) 上有一个索引

于 2012-11-25T04:26:14.910 回答
1

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

把 WHERE 的 klm 一半取出,放到 LEFT JOIN 中。

于 2012-11-25T00:21:46.070 回答
1

正如保罗·格雷戈里所说。我认为这应该被接受为答案。我只想补充一点,当且仅当您希望将键值的比较限制为来自同一站点的键值的比较时,才应在 join 'on' 子句中比较站点值,这似乎是您想要的。在任何一种情况下,如果您想将结果限制为 ktm.site = 2,可以在 join on 子句以及 ktm.site = klm.site 或 where 子句中使用它,只是不要将 klm .site 在 where 子句中。

于 2012-11-25T11:24:21.013 回答
0

如果您将表分成两张表,一张用于本月,一张用于上个月,您会注意到键列中的细微差异。上个月的组有一个名为“bmi”的键,该键在本月中缺失,而本月的键名为“smultringer”,上个月缺失。由于缺少您在 中指定的匹配项,klm.key = ktm.key这些行将被排除在连接之外,只为您提供 10 行而不是 11 行。

编辑:我并不是说要真正分开桌子,我的意思是在心理上这样做来比较各组。

于 2012-11-25T04:32:59.680 回答