Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/77.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 如果第三个表没有该值,请连接三个表_Mysql_Sql - Fatal编程技术网

Mysql 如果第三个表没有该值,请连接三个表

Mysql 如果第三个表没有该值,请连接三个表,mysql,sql,Mysql,Sql,表1 id、用户id、事件id、名称 表2 eventid、zoneid、userid 表3 事件ID、用户ID、状态 如果所有三个表都有eventid,则意味着我不想选择该记录(我的意思是如果表3有eventid),否则我需要选择记录 我试着提出我的问题 SELECT * FROM `table1` c1 INNER JOIN `table2` c2 ON c2.eventid = c1.eventid LEFT JOIN table3 c3 ON

表1

id、用户id、事件id、名称

表2

eventid、zoneid、userid

表3

事件ID、用户ID、状态

如果所有三个表都有eventid,则意味着我不想选择该记录(我的意思是如果表3有eventid),否则我需要选择记录

我试着提出我的问题

SELECT 
    * 
FROM 
    `table1` c1 
    INNER JOIN `table2` c2 ON c2.eventid = c1.eventid  
    LEFT JOIN table3 c3 ON c3.eventid = c1.eventid 
WHERE 
    c2.zoneid=2 
    AND c1.active='1' 
GROUP BY 
    c1.eventid

在没有c3的情况下添加where子句:

SELECT * 
FROM `table1` c1 
INNER JOIN `table2` c2 ON c2.eventid = c1.eventid  
LEFT JOIN table3 c3 ON c3.eventid = c1.eventid 
WHERE c2.zoneid=2 AND c1.active='1' 
AND c3.id IS NULL
group by c1.eventid 

在没有c3的情况下添加where子句:

SELECT * 
FROM `table1` c1 
INNER JOIN `table2` c2 ON c2.eventid = c1.eventid  
LEFT JOIN table3 c3 ON c3.eventid = c1.eventid 
WHERE c2.zoneid=2 AND c1.active='1' 
AND c3.id IS NULL
group by c1.eventid 

第三个表上的左连接和条件
,其中C.eventid为NULL
,应该可以完成这项工作

SELECT * 
FROM   table1 A 
       INNER JOIN table2 B 
                    ON A.eventid = B.eventid 
       LEFT OUTER JOIN table3 C 
                    ON A.eventid = C.eventid 
WHERE  C.eventid IS NULL 

第三个表上的左连接和条件
,其中C.eventid为NULL
,应该可以完成这项工作

SELECT * 
FROM   table1 A 
       INNER JOIN table2 B 
                    ON A.eventid = B.eventid 
       LEFT OUTER JOIN table3 C 
                    ON A.eventid = C.eventid 
WHERE  C.eventid IS NULL 
对通过左/右外部联接联接的表应用WHERE条件(如其他一些答案所建议的)实际上会使其成为常规联接。 发布的其他示例要求c1.eventid等于c3.eventid,c3.eventid等于NULL——结果很可能不是您期望的结果,这取决于数据库如何处理
c1.eventid=c3.eventid
,如果两者都为NULL(我必须仔细阅读)

对通过左/右外部联接联接的表应用WHERE条件(如其他一些答案所建议的)实际上会使其成为常规联接。
发布的其他示例要求c1.eventid等于c3.eventid,c3.eventid等于NULL-很可能结果不是您期望的结果,这取决于数据库如何处理
c1.eventid=c3.eventid
如果两者都为NULL(我必须仔细阅读)。

似乎您误读了其他答案。外部联接表上where子句中的唯一条件是
id不为null
。这正好给出了所需要的:表1+表2,其中不存在表3。不过,我还是更喜欢你的方法。我认为它更具可读性,因为它实际上说:从表1和表2中读取,其中表3中不存在匹配的记录。我认为左外边加入了一个诡计而不是直截了当的方式。你是对的。我只是有太多的例子,人们做左连接,然后用条件破坏它。检查
NULL
不会让我忘记这一点,但与您一样,我发现该解决方案的可读性较低。:)如果他不需要表3中的任何记录,那么这是最好的方法。似乎你误读了其他答案。外部联接表上where子句中的唯一条件是
id不为null
。这正好给出了所需要的:表1+表2,其中不存在表3。不过,我还是更喜欢你的方法。我认为它更具可读性,因为它实际上说:从表1和表2中读取,其中表3中不存在匹配的记录。我认为左外边加入了一个诡计而不是直截了当的方式。你是对的。我只是有太多的例子,人们做左连接,然后用条件破坏它。检查
NULL
不会让我忘记这一点,但与您一样,我发现该解决方案的可读性较低。:)如果他不需要表3中的任何记录,那么这是最好的方法。