带有 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()、...等)