【问题标题】:SQL - GROUP BY having count, joining multiple tablesSQL - GROUP BY 有计数,连接多个表
【发布时间】:2017-12-12 17:58:17
【问题描述】:

我有 4 张桌子:

Entries:
id
year
day

AnalysisText:
id
text
entries_id

AnalysisType:
id
type

AnalysisTextTypes:
id
analysistext_id
analysistype_id

示例数据:

entries     
id  year    day
1   2010    1
2   2011    4
3   2012    6


AnalysisText        
id  text    entries_id
1   blah    2
2   more blah   1
3   blah blah   1

AnalysisType        
id  type    
1   A   
2   B   
3   C   

AnalysisTextTypes       
id  analysistext_id analysistype_id
1   1   1
2   1   2
3   2   3
4   3   1

我需要获取具有多个analysistype 的所有analysistext 值,以及与具有多个analysistype 的这些analysistext 关联的所有entries

所以在上面的数据中,我们想要结果

my_date text    type
2011-4  blah    A
2011-4  blah    B

因为那是具有不止一种类型的文本。

下面的查询有效,但是使用子查询来识别大于analysisTypeanalysisText 值感觉效率低下:

select  
CONCAT(e.year, '-', e.day) as my_date,
x.text,
y.type
from entries e
join analysistext x on e.id = x.entries_id
join analysistext_types xy on xy.analysistext_id = x.id
join analysistype y on y.id = xy.analysistype_id
where xy.analysistext_id in (
    select analysistext_id
    from analysistext_types
    group by analysistext_id
    having count(analysistype_id) > 1
) order by my_date, analysis_text, type;

我想要一个查询,我们 SELECT 来自已连接表的感兴趣的字段,并直接在要连接的表上执行 group byhaving count。这可能吗?

【问题讨论】:

    标签: mysql sql join count having


    【解决方案1】:

    您可以使用自连接来完全避免子查询

    select concat(e.year, '-' ,e.day), at.text ,ant.type
    from AnalysisText at
    join entries e on at.entries_id = e.id
    join AnalysisTextTypes att on att.analysistext_id = at.id
    join AnalysisType ant on att.analysistype_id = ant.id
    join AnalysisTextTypes att2 on att2.analysistext_id = att.analysistext_id
    group by att2.analysistext_id
    having count(att2.analysistext_id) > 1
    

    【讨论】:

    • 我看不出这与我的查询有什么区别?这包括我试图避免的WHERE 子句中的嵌套子查询。我希望 GROUP BYHAVING 发生在连接的表上,而不是在 WHERE 子句中。我的感觉是,这不仅更优雅,而且更高效。
    猜你喜欢
    • 2020-10-02
    • 1970-01-01
    • 2021-12-14
    • 1970-01-01
    • 2011-02-07
    • 1970-01-01
    • 1970-01-01
    • 2020-11-02
    • 1970-01-01
    相关资源
    最近更新 更多