Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/63.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 - Fatal编程技术网

Mysql 用于在左联接中没有匹配行时获取所有行的SQL查询

Mysql 用于在左联接中没有匹配行时获取所有行的SQL查询,mysql,sql,Mysql,Sql,我有这样一个表结构: person (pid, pname) personSamples(sid,pid,sampleName) groups(gid,groupName) groupPersons(gpid,gid,pid) grouppersonSamples(gpsid,gid,sid) 每当一个人被添加到一个组(即在groupPersons表中),我都会在grouppersonSamples表中添加一些选定的个人样本 要求是,如果我没有在grouppersonSamples中插入任何行

我有这样一个表结构:

person (pid, pname)
personSamples(sid,pid,sampleName)
groups(gid,groupName)
groupPersons(gpid,gid,pid)
grouppersonSamples(gpsid,gid,sid)
每当一个人被添加到一个组(即在
groupPersons
表中),我都会在
grouppersonSamples
表中添加一些选定的个人样本

要求是,如果我没有在
grouppersonSamples
中插入任何行,则从
personSamples
中为给定的个人和组选择全部

我要做的是左键连接
grouppersonSamples
,检查
grouppersonSamples
中是否没有匹配的行,然后执行另一个查询,从给定pid的
personSamples
中选择所有


是否有任何方法可以在单个查询中获取全部信息?

以下查询将为您提供给定人员(pid)的组人员样本(gid、sid),这些样本尚未出现在grouppersonSamples表中:

假设给定人员的pid为3。我没有考虑添加此人的组的gid。如果您想考虑一个特定的组,在下面的查询中添加类似于PID=3条件的GID筛选器。
select T1.gid, T1.sid from
    (select gid, sid from groupPersons, personSamples where groupPersons.pid = personSamples.pid and groupPersons.pid = 3) as T1
LEFT JOIN
    (select grouppersonSamples.gid, grouppersonSamples.sid from personSamples, groupPersons, grouppersonSamples where personSamples.pid = 3 and personSamples.pid = groupPersons.pid and grouppersonSamples.gid = groupPersons.gid and grouppersonSamples.sid = personSamples.sid) as T2
ON T1.gid = T2.gid and T1.sid = T2.sid where T2.gid IS NULL;
第一个查询提取给定人员(假设pid=3)的所有可能的组人员样本(gid,sid),第二个查询提取给定人员的grouppersonSamples表中存在的所有组人员样本(gid,sid)

然后,左连接作为减号操作,并为给定人员提供grouppersonSamples表中尚未存在的组人员样本(gid、sid)

您还可以在insert语句中使用上述查询,如下所示:

insert into grouppersonSamples(gid, sid) (<above query>);
插入grouppersonSamples(gid,sid)();

注意:我使用左连接执行减号操作,因为Mysql不支持减号运算符。如果您的DBS支持减号运算符,您可以直接使用减号运算符。

您可以在问题中插入您已经尝试过的查询吗?