1

この問題に関連する 5 つのテーブルがあります。

[contact master]
    id (pk)
    title
    fname
    lname
    country

[home address]
    id (pk)
    contact_id (fk)
    hmcountry
    ...

[office address]
    id (pk)
    contact_id (fk)
    off_country
    ...

[category master]
    id (pk)
    name

[category to contacts]
    id (pk)
    catid
    contactid

[次のクエリは 0 行を返します]

select 
      c1.id, 
      title, 
      fname, 
      lname, 
      c1.country as country, 
      c4.hmcountry as hmcountry, 
      c5.off_country as off_country 
   from 
      contacts
         join contact_to_categories c2 on c2.contactid=c1.id
         join `contact_address` c4 ON c4.`contact_id` = c1.`id` 
         join `contact_offices` c5 ON c5.`contact_id` = c1.`id`
   where 
          c2.catid=2 
      and ( c1.country like '%Korea, North%' 
         or c4.hmcountry like '%Korea, North%' 
         or c5.off_country like '%Korea, North%' )

[以下は正常に機能し、意図した結果を返すため]

SELECT 
      `contact_id` 
   FROM 
      `contact_address` 
   WHERE 
          `hmcountry` like '%Korea, North%' 
      and `contact_id` in (select `contactid` 
                              from `contact_to_categories` 
                             where `catid` in(2,3,6) )

[またはこれでも機能します]

SELECT 
      `contact_id` 
   FROM 
      `contact_offices` 
   WHERE 
          `off_country` like '%Korea, North%' 
      and `contact_id` in ( select `contactid` 
                               from `contact_to_categories` 
                              where `catid` in(2,3,6) )

私が間違っていることは何か提案はありますか?

私がやろうとしているのは、メインの連絡先マスターテーブル、オフィスの住所、または自宅の住所のいずれかで、国として「韓国、北」を持つすべての連絡先を見つけることです。INNER JOIN、LEFT JOINなどを試しましたが、うまくいきません。助けてください!

事前にご協力いただきありがとうございます。

4

4 に答える 4

0

北朝鮮に関連する連絡先、自宅の住所、またはオフィスの住所のいずれかに結合されたすべての個別の連絡先 ID の事前クエリを実行しました。そこから、カテゴリへの連絡先に参加して、2、3、6 カテゴリを除外します。これで、ID だけで修飾された連絡先の単一のリストが作成されました。

次に、そのリストを使用して、資格のある ID のメインの連絡先リストに再び参加し、LEFT-JOIN を介してそれぞれの自宅またはオフィスの住所の場所に参加します (どちらも存在しないか、どちらか一方しか存在しない場合)。もしや住所?それ以外の場合は空白として表示されます

SELECT
      PQ.Contact_ID,
      cm2.title,
      cm2.fname,
      cm2.lname,
      cm2.country,
      coalesce( ha2.hmcountry, ' ' ) as HomeCountry,
      coalesce( oa2.off_country, ' ' ) as OfficeCountry
   from 
      ( select distinct cm.id as Contact_ID
           from contact_master cm
           where cm.country like '%Korea, North%' 
        union
        select distinct ha.contact_id
           from home_address ha
           where ha.hmcountry like '%Korea, North%' 
        union
        select distinct oa.contact_id
           from office_address oa
           where oa.off_country like '%Korea, North%' ) as PQ

      JOIN contact_to_categories c2c
         on PQ.Contact_ID = c2c.contactid
         AND c2c.catid in(2,3,6)

      JOIN contact_master cm2
         ON PQ.Contact_ID = cm2.id
         LEFT JOIN home_address ha2
            ON PQ.Contact_ID = ha2.Contact_ID
         LEFT JOIN office_address oa2
            ON PQ.Contact_ID = ha2.Contact_ID
于 2013-10-02T16:15:35.967 に答える
0

ここにはいくつかの可能性があります。

最初のものはおそらく明白なことを述べており、これがそれであるとは思えませんが、最初のクエリでは次のようになります。

WHERE   c2.catid = 2 

次の 2 つのクエリでは、次のようになります。

WHERE `catid` IN (2, 3, 6)

これら 2 つによって返されたすべての行が CatID 3 および 6 にある可能性はありますか? これにより、最初のクエリで結果が返されない理由が説明されます。

より可能性の高い 2 番目の可能性 ( を使用した場合、2 番目と 3 番目のクエリでもレコードが返されると仮定した場合WHERE CatID = 2) は、北朝鮮に自宅の住所があり、オフィスの住所もある連絡先、または北朝鮮にオフィスの住所がある連絡先が存在しないことです。自宅住所もあります。

LEFT JOIN で何を試したかはわかりませんが、両方の小さなクエリで結果が返されなかった場合に、なぜ結果が返されないのかわかりません。

SELECT  c1.id, 
        title, 
        fname, 
        lname, 
        c1.country as country, 
        c4.hmcountry as hmcountry, 
        c5.off_country as off_country 
FROM    contacts
        INNER JOIN contact_to_categories c2 
            ON c2.contactid = c1.id
        LEFT JOIN `contact_address` c4 
            ON c4.`contact_id` = c1.`id` 
        LEFT JOIN `contact_offices` c5 
            ON c5.`contact_id` = c1.`id`
WHERE   c2.catid = 2 
AND (   c1.country LIKE '%Korea, North%' 
    OR  c4.hmcountry LIKE '%Korea, North%' 
    OR  c5.off_country LIKE '%Korea, North%' 
    );
于 2013-10-01T16:55:12.173 に答える
0

あなたの結合では contact_id = id で結合していることに気付きましたが、実際のクエリでは contact_id が contactid であるかどうかを確認します。作業クエリで使用するのと同じ列を使用するように結合を変更します。

デバッグするには、これを試してください:

SELECT  *
FROM    contacts c1            
WHERE   c1.country LIKE '%Korea, North%' 

そしてそれが何を返すかを見てください。次に、行が0になるまで一度にテーブルを追加し続けます。

SELECT  *
FROM    contacts c1            
INNER JOIN contact_to_categories c2 
            ON c2.contactid = c1.id
WHERE   c1.country LIKE '%Korea, North%' 

次に、それが機能する場合は、where 句を追加します。

c2.catid = 2

等々。

于 2013-10-01T16:37:22.817 に答える
0

WHERE 句が除外する値が多すぎる可能性があります。結合に条件を入れてみてください。

SELECT c1.id
    , title
    , fname
    , lname
    , c1.country AS 'country'
    , c4.hmcountry AS 'hmcountry'
    , c5.off_country AS 'off_country' 

FROM contacts
    JOIN contact_to_categories c2 ON c2.contactid=c1.id
        AND c2.catid = 2
    JOIN `contact_address` c4 ON c4.`contact_id` = c1.`id` 
        AND c4.hmcountry like '%Korea, North%'
    JOIN `contact_offices` c5 ON c5.`contact_id` = c1.`id`
        AND c5.off_country like '%Korea, North%'

WHERE c1.country like '%Korea, North%'

さらに、NULL があると行が削除される可能性があります。左結合または右結合を試して、結合チェーンのどこで行が失われるかを確認します。また、これを分解して、一度に 1 つずつ結合を行います。ベーステーブルから始めます。結合を 1 つ追加して、期待どおりの結果が返されるかどうかを確認してから、次の結合を追加します。

これが役立つかどうか教えてください。

于 2013-10-01T16:37:44.333 に答える