带有 WHERE 子句的 GROUP BY 以及 sql 中的 OR 的 LEFT JOIN

Posted

技术标签:

【中文标题】带有 WHERE 子句的 GROUP BY 以及 sql 中的 OR 的 LEFT JOIN【英文标题】:LEFT JOIN with GROUP BY with WHERE clause and also with OR in sql 【发布时间】:2018-07-16 05:07:06 【问题描述】:

我有 3 张桌子: 表 1 - “taxonomy_index”,我们有 4 列(列是 nid、tid、sticky、created)

表 2 - “节点”,我们有 15 列(列是 nid、vid、type 等...)

表 3 - “taxonomy_term_data”,我们有 6 列(列是 tid、vid、name 等)

我想加入这3张桌子,也有一些条件。

我知道单个查询,但我想将所有查询设置为一个并形成一个联接

查询 1

SELECT count(*), tid 
FROM taxonomy_index 
GROUP BY tid HAVING COUNT(*) >3

这个查询给了我两个值,一个是count,另一个是tid。即tid被使用了多少次。

查询 2

select * 
from node 
where type='book' OR type='student' 
OR type='teacher' OR type='class';

在这里我将获取与这些内容类型相关联的节点。

我想加入 3 张桌子。在输出中,我想获取每个 tid 使用了多少次(查询 1)和类型(查询 2),并从 taxonomy_term_data 获取 tid 名称。

给定类型的计数、tid、名称

【问题讨论】:

更新您的问题添加适当的数据样本和预期结果 mysql 还是 SQL Server? 见meta.***.com/questions/333952/… 节点表是否包含tid?你要加入什么? SELECT count(), t1.tid, [name] FROM taxonomy_index t1 内部连接 ​​taxonomy_term_data t3 on t1.tid = t3.tid 内部连接节点 t2 on t1.nid = t2.nid和 (type='book' OR type='student' OR type='teacher' OR type='class') GROUP BY t1.tid, t3.[name] HAVING COUNT() >3 假设你有taxonomy_term_data 中每个 tid 的一行 【参考方案1】:
SELECT distinct t1.TID, t3.name, cntt1.count from taxonomy_index t1 
inner join 
( 
SELECT count(*) as 'count', t1.tid 
FROM taxonomy_index t1 
GROUP BY t1.tid HAVING COUNT(*) >3 
) cntt1 on t1.tid = cntt1.tid 
inner join node t2 on t1.nid = t2.nid and (type='book' OR type='student' OR 
type='teacher' OR type='class') 
inner join taxonomy_term_data t3 on t1.tid = t3.tid

【讨论】:

cntt1... 是什么意思? 我不明白这个“cntt1.tid” @Blue Moon, cntt1 只是 Subquery 的表结果的别名,它返回所有 count() > 3 的 tid【参考方案2】:

好的,假设您每次都可以加入 tid,您可以使用以下语法。请注意,这里的 CTE 不是强制性的,我只是觉得它们对可读性很有用。

;WITH CTE_Count AS 
 (
 SELECT count(*) AS Count, tid 
 FROM taxonomy_index 
 GROUP BY tid HAVING COUNT(*) >3
 )

, CTE_Node AS 
 (select * 
  from node 
  where type='book' OR type='student' 
  OR type='teacher' OR type='class' )

 , CTE_TermData AS 
 (SELECT * FROM taxonomy_term_data)

 SELECT CC.tid, CC.Count, CN.Node, CT.tid_Name
 FROM CTE_Count AS CC
 INNER JOIN CTE_Node AS CN ON CN.tid = CC.tid
 INNER JOIN CTE_TermData AS CT ON CT.tid = CC.tid

【讨论】:

对不起,我不明白 CTE...什么是 CTE? CTE 是公用表表达式。这只是打破某些逻辑的语法方式。它有不同的用例,但在这里我创建了一些稍后加入的查询。 这里要不要加CTE?

以上是关于带有 WHERE 子句的 GROUP BY 以及 sql 中的 OR 的 LEFT JOIN的主要内容,如果未能解决你的问题,请参考以下文章

使用多个 WHERE 子句和 GROUP BY 销售人员访问 SQL、聚合总和

不能在 Group by/Order by/Where/ON 子句中使用 Group 或 Aggregate 函数(min()、max()、sum()、count()、...等)

GROUP BY,WHERE,HAVING之间的区别和用法

在 WHERE 或 GROUP BY 子句中使用列表别名

使用 Group By 作为 where 子句的一部分

SQL语句中,为啥where子句不能使用列别名,而order by却可以?