Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/symfony/6.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_Postgresql_Count_Inner Join_Having Clause - Fatal编程技术网

Sql 如何管理计数、分组和拥有?

Sql 如何管理计数、分组和拥有?,sql,postgresql,count,inner-join,having-clause,Sql,Postgresql,Count,Inner Join,Having Clause,我没有在SQL方面做过实验,我可能会尝试做一些不可能的事情。SQL给人的感觉是,只需一个请求就可以做到,但可能不行 我有4个连接表A->S->T->F。 一个简单的请求为我提供以下数据: select a.id, s.id, t.type, f.name from table_a a inner join table_s s on a.id = s.id inner join table_t t on t.id = s.t_id inner join table_f f

我没有在SQL方面做过实验,我可能会尝试做一些不可能的事情。SQL给人的感觉是,只需一个请求就可以做到,但可能不行

我有4个连接表A->S->T->F。 一个简单的请求为我提供以下数据:

select a.id, s.id, t.type, f.name
from table_a a
    inner join table_s s on a.id = s.id
    inner join table_t t on t.id = s.t_id
    inner join table_f f on f.id = t.f_id
where f.name = 'C';

a.id | s.id | t.type | f.name
-----------------------------
1    | 1    | E      | C
1    | 2    | R      | C
2    | 3    | E      | C
3    | 4    | R      | C
我想找到所有与多个S行关联的A ID。 我想找到所有只有一行T type=R的a id

对于第一个,我进行了以下SQL查询:

select a.id from table_a a
    inner join table_s s on a.id = s.id
    inner join table_t t on t.id = s.t_id
    inner join table_f f on f.id = t.f_id
where f.name = 'C'
group by a.id
having count(s.*) > 1;
但是现在,对于第二个查询,我不知道如何根据t.type和count进行过滤。 我尝试此请求,但响应不好(返回a.id=1)

有什么想法吗? 多谢各位

我想找到所有只有一个T type=R的S行的a ID

这是你想要的吗

select a.id from table_a a
    inner join table_s s on a.id = s.id
    inner join table_t t on t.id = s.t_id
    inner join table_f f on f.id = t.f_id
where f.name = 'C' 
group by a.id
having count(*) = 1 and min(t.type) = 'R'
这将为您提供只有一行的组,其类型为“R”

我想找到所有只有一个T type=R的S行的a ID

这是你想要的吗

select a.id from table_a a
    inner join table_s s on a.id = s.id
    inner join table_t t on t.id = s.t_id
    inner join table_f f on f.id = t.f_id
where f.name = 'C' 
group by a.id
having count(*) = 1 and min(t.type) = 'R'

这将为您提供只有一行的组,其类型为“R”。

是的,它似乎有效,谢谢。但是我真的不明白MIN的用法。我很难理解have的用法……我想have是在分组后过滤结果。好的,在分组之前,计数(s.*=1是在数据上的,但是最小值对我来说太神奇了:)@MychaL:因为组中只有一行(这就是
having
子句所做的),那么
MIN()
将为您提供组中可用的(唯一)值。是的,它似乎有效,谢谢。但是我真的不明白MIN的用法。我很难理解have的用法……我想have是在分组后过滤结果。好的,在分组之前,计数(s.*=1是在数据上的,但是最小值对我来说非常神奇:)@MychaL:因为组中只有一行(这就是
having
子句所做的),那么
MIN()
给出组中可用的(唯一)值。请在代码问题中给出一个--cut&paste&runnable代码,包括作为代码输入的最小代表性示例;期望和实际输出(包括逐字记录错误消息);标签和版本;清晰的说明和解释。尽可能少地给出代码,即显示为OK的代码,并通过显示为not OK的代码进行扩展。(调试基础。)用于包含DBMS和DDL(包括约束和索引)的SQL,并以表格式作为代码输入。暂停总体目标的工作,将代码切分为第一个表达式,没有给出您期望的内容,说出您期望的内容和原因。请在代码问题中给出一个--cut&paste&runnable代码,包括作为代码输入的最小代表性示例;期望和实际输出(包括逐字记录错误消息);标签和版本;清晰的说明和解释。尽可能少地给出代码,即显示为OK的代码,并通过显示为not OK的代码进行扩展。(调试基础。)用于包含DBMS和DDL(包括约束和索引)的SQL,并以表格式作为代码输入。在总体目标上暂停工作,在第一个表达中删去代码,不要给出你期望的,说出你期望的,为什么。