Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.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
Sql 基于第三个表中定义的关系连接两个表,并将第二个表中的几行放在一行中_Sql_Sqlite - Fatal编程技术网

Sql 基于第三个表中定义的关系连接两个表,并将第二个表中的几行放在一行中

Sql 基于第三个表中定义的关系连接两个表,并将第二个表中的几行放在一行中,sql,sqlite,Sql,Sqlite,我正在学习SQL,目前正在尝试使用SQLite编写应用程序。目前我有3个表: 合作社: cid整数主键, 人: pid整数主键, 名称字符串, 在合作社工作的人员: cid整数, pid整数, 作业整数 我想生成一个新表,其中每一行都有来自合作社的数据,还有来自工作为“0”(总裁)、“1”(秘书)、“2”(财务主管)和工作为“4”(顾问)的三个人的pid 目前,我可以加入表,但我找不到一种方法来合并最后一个表中6行不同的人。有人能告诉我如何进行吗 编辑:到目前为止,我写的是一个长连接: SE

我正在学习SQL,目前正在尝试使用SQLite编写应用程序。目前我有3个表:

合作社: cid整数主键,

人: pid整数主键, 名称字符串,

在合作社工作的人员: cid整数, pid整数, 作业整数

我想生成一个新表,其中每一行都有来自合作社的数据,还有来自工作为“0”(总裁)、“1”(秘书)、“2”(财务主管)和工作为“4”(顾问)的三个人的pid

目前,我可以加入表,但我找不到一种方法来合并最后一个表中6行不同的人。有人能告诉我如何进行吗

编辑:到目前为止,我写的是一个长连接:

SELECT cooperative.cid, person.name AS president,  person.pid  AS president_pid,
person.name AS secretary,  person.pid  AS secretary_pid, person.name AS treasurer,
person.pid  AS treasurer_pid,  person.name AS counselor1, person.pid  AS 
counselor1_pid, person.name AS counselor2, person.pid  AS counselor2_pid, person.name
AS counselor3, person.pid  AS counselor3_pid FROM cooperativ1 LEFT JOIN 
person_works_in_cooperative ON cooperative.cid = person_works_in_cooperative.cid 
LEFT JOIN person ON person_works_in_cooperative.pid = person.pid;

但我不知道如何告诉数据库,我希望我询问的每对人名和PID应该对应于person表中的不同人员。

这将提供三个表中的所有列:

SELECT *
FROM cooperative c
    JOIN person_works_in_cooperative pw ON pw.cid = c.id
    JOIN  PERSON p ON pw.pid = p.id
WHERE pw.job IN (0, 1, 2, 4);
并将向您展示每个合作社的所有总裁、秘书等

如果您只需要特定合作社的信息,可以在
WHERE
子句中添加一个附加条件:

AND c.id = 1;

编辑

相反,如果您希望将所有相关信息都放在同一行中作为协作行的信息,那么使用普通SQL是无法做到的

select c.cid, 
       (select pid from person_works_in_cooperative pc0 where pc0.cid = c.cid and pc0.job = 0 ) "president",
       (select pid from person_works_in_cooperative pc1 where pc1.cid = c.cid and pc1.job = 1) "secretary",
       (select pid from person_works_in_cooperative pc2 where pc2.cid = c.cid and pc2.job = 2) "treasurer"
from cooperative c 

这只是每个合作社的总裁、秘书和财务主管的解决方案。不能为三位顾问发明一个简单的解决方案。抱歉。

显示您迄今为止编写的SQL。谢谢,但此查询为数据库中具有有效作业的每个人提供了不同的行。但我需要的是,在同一个合作社工作的每个人都出现在与该合作社对应的同一行中。比如,如果合作社1中有3个人,你希望该合作社的行有3列吗?如果有5个人在合作社2工作,你希望该合作社的行有5列吗?如果是这样的话,我不认为用普通的SQL就可以做到这一点,您应该自动生成查询。如果你有一个像Oracle这样的RDBMS,你可以动态地组合你的查询,否则你必须依赖你的服务器端编程语言。是的,这看起来不可能用一个查询来完成我计划的任务。正如您所指出的,这意味着一种获得具有可变列数的表的方法,而这不适合关系模型。谢谢你的回答。因为正确的答案是“不可能”,我会把你的答案记为被接受的答案。@thiagohharry Good。我编辑了这个问题以添加额外的信息:-)谢谢你的回答。对不起,我想我在第一篇文章中把问题简单化了。我不仅需要获取人员的pid,还需要获取人员的姓名,因此我确实需要加入3个表。加入后,您的解决方案对总裁、秘书和财务主管确实有效,但我担心必须使用子查询来获取每个合作社中每个人的每个属性。也许最好的方法是再编写一个查询,让PHP中的所有人都参与到每个协作中,并在打印结果之前将查询组合到服务器端编程中。