【问题标题】:MySQL left join returning wrong number of resultsMySQL左连接返回错误数量的结果
【发布时间】:2012-11-25 00:17:47
【问题描述】:

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

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 行,并且看起来更像是内部加入表格而不是比左加入。

有人有什么想法吗?

【问题讨论】:

    标签: mysql left-join


    【解决方案1】:

    我认为查询非常接近...但是将您的连接条件也放在相同的类型上,并且只将类型的 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) 上有一个索引

    【讨论】:

    • @ypercube,感谢上个月与本月对关键字的修改。看来我晚上 11:30 没有那么专注 :)
    【解决方案2】:

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

    把WHERE的klm一半取出来放到LEFT JOIN里面。

    【讨论】:

    • 感谢您的回复!我明白你在说什么,但我似乎仍然无法让它工作。我尝试了以下方法:SELECT ktm.key AS 关键字,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' AND klm.site_id = 2) WHERE ktm.site_id = 2 ORDER BY this month ASC 现在它返回一堆没有指定类型的行。有什么想法吗?
    • 将 ktm.type = 位移动到 WHERE。
    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

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

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

      【讨论】:

      • 这不是左连接的重点吗?要包含左表中的所有记录,并且仅包含右表中匹配的记录?
      猜你喜欢
      • 1970-01-01
      • 2012-06-10
      • 1970-01-01
      • 2012-03-26
      • 2021-03-15
      • 1970-01-01
      • 2015-02-10
      • 2013-01-23
      • 2011-02-23
      相关资源
      最近更新 更多