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

'organic-keywords-this-month'タイプの11行があるため、11行を返す必要があると思いますが、実行すると10行しか返されず、左結合ではなく内部結合のように見えます。 。

誰かアイデアはありますか?

4

4 に答える 4

2

クエリは非常に近いと思います...しかし、同じタイプにも結合条件を設定し、この月のデータに関連付けられたWHERE句にそのタイプのQUALIFIERのみを配置します

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 

「ANDktm.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を取り出し、LEFTJOINに入れます。

于 2012-11-25T00:21:46.070 に答える
1

ポールグレゴリーが言うように。それが答えとして受け入れられるべきだと思います。キー値の比較を同じサイトからの値に制限したい場合にのみ、join'on'句内でサイト値を比較する必要があることを付け加えておきます。いずれの場合も、結果をktm.site = 2に制限する場合は、joinon句とktm.site= klm.site、またはwhere句のいずれかに、klmを入れないでください。 where句の.site。

于 2012-11-25T11:24:21.013 に答える
0

テーブルを2つのテーブルに分割すると、1つは今月用、もう1つは先月用で、キー列にわずかな不一致があります。先月のグループには、今月から欠落している「bmi」というキーがあり、今月には、先月から欠落している「smultringer」というキーがあります。で指定した一致がないためklm.key = ktm.key、これらの行は結合から除外され、11行ではなく10行になります。

編集:私は実際にテーブルを分離すると言っているのではなく、グループを比較するために精神的にそれを行うつもりでした。

于 2012-11-25T04:32:59.680 に答える