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

我注意到在你的加入中你加入了contact_id = id,但是在你的工作查询中你检查了contactid中的contact_id。更改您的联接以使用您在工作查询中使用的相同列。

要调试,试试这个:

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 都可能导致行丢失。我会尝试左连接或右连接,以查看连接链中您丢失行的位置。此外,将其分解并一次加入一个。从基表开始。添加一个连接并查看它是否返回您的预期结果,然后添加下一个,依此类推。

让我知道这是否有帮助。

于 2013-10-01T16:37:44.333 回答
0

这里有几种可能性。

第一个很可能说明了显而易见的事情,我怀疑就是这样,但是在您的第一个查询中,您有:

WHERE   c2.catid = 2 

在接下来的两个查询中,您有:

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

这两者带回的所有行是否都在CatID 3和6中?这可以解释为什么您的第一个查询没有返回结果。

第二个更可能的可能性(假设您的第二个和第三个查询仍然返回记录,如果您使用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

我已经对与 N. Korea 关联的任何一个联系人、家庭地址或办公室地址联合的所有不同联系人 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 回答