Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql SQL联接查询不起作用_Mysql_Sql_Join_Left Join_Inner Join - Fatal编程技术网

Mysql SQL联接查询不起作用

Mysql SQL联接查询不起作用,mysql,sql,join,left-join,inner-join,Mysql,Sql,Join,Left Join,Inner Join,此问题涉及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

此问题涉及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) )
有什么建议我做错了什么

我想做的是在主联系人主表或办公室地址或家庭地址中查找所有以朝鲜、朝鲜为国家的联系人。我尝试过内连接、左连接等,但没有运气。请帮忙


提前感谢您的帮助。

我注意到在您的加入中,您是通过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

等等。

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


如果有帮助,请告诉我。

这里有几种可能性

第一个问题只是简单地陈述了显而易见的事实,我对此表示怀疑,但在你的第一个问题中,你有:

WHERE   c2.catid = 2 
WHERE `catid` IN (2, 3, 6)
在接下来的两个查询中,您有:

WHERE   c2.catid = 2 
WHERE `catid` IN (2, 3, 6)
这两个命令返回的所有行是否都在CatID 3和CatID 6中?这可以解释为什么第一个查询不返回结果

第二种可能性更大,假设您的第二次和第三次查询仍然返回记录,如果您使用其中的CatID=2 是指没有联系人在朝鲜有家庭地址,也没有办公地址,或者没有联系人在朝鲜有办公地址,也没有家庭地址

我不确定您使用左连接尝试了什么,但我不明白,如果两个较小的查询都返回了结果,为什么它不会返回结果

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%' 
    );

我已经对所有不同的联系人ID进行了预查询,这些ID是针对与朝鲜有关的联系人、家庭地址或办公室地址中的任何一个而联合的。在此基础上,加入联系人类别,筛选出您的2、3、6个类别。因此,现在您有了一个仅根据其ID限定的联系人列表

现在,使用该列表重新连接到那些合格ID上的主联系人列表,并通过左键连接到各自的家庭或办公室地址位置,以防两者都不存在或只有一个存在。如果有地址?很好,抓住它,否则显示为空白

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

只是打字错误。我只是想了解一下我正在尝试运行的查询。查询中没有sql错误,但返回0行。@Kunal好的,您还有catid in2,3,6,但对于连接,您有c2.catid=2。是否没有id为2的行,只有3和6?如果有,按照BClaydon的建议一次一个地进行连接,以查看数据丢失的位置。我尝试了他的建议,并发布了查询。有catid=2的条目,但也可能有需要使用多个ID进行搜索的情况,所以我举了一个例子。@Kunal我在你的帖子上没有看到编辑。正如他所建议的,我会尝试从表1中选择*,然后只添加连接,然后添加新连接的位置,等等,直到行数用完并确定不起作用的语句。选择c1.id、title、fname、lname、c1.country作为country,c4.hmcountry作为hmcountry,c5.off_country作为off_country从联系人c1加入联系人到c2上的类别c2.contactid=c1.id和c2.catid=2加入联系人地址c4.contact_id=c1.id和c4.HM类似于“%Korea,South%”加入联系人办公室c5.contact_id=c1.id和c5.off_类似于“%Korea,South%”其中c1.country类似于“%Korea,South%”谢谢,稍后将尝试此操作并通知您。DB已经有多个类别Id为2、3和6的条目。在某些情况下,我可能需要使用多个类别进行搜索,因此在示例中使用了这些类别。尝试了上述查询。必须从联系人c1添加,除了它运行正常但耗时太长。我等了2分钟,然后放弃了。不知道为什么。我没想到它会挂这么久,这些表上有索引吗?如果是这样的话,您可以更新问题,使用什么索引,以及运行不返回行的查询时的解释计划。