请教一个 SQL 的问题,来个大佬帮忙丁真下

97 天前
 bingfengCoder
SELECT
	p.project_code AS 项目编码,
	p.project_name AS 项目名称,
	count( e.id ) AS 建筑数量,
	count( d.id ) AS 设备数量 
FROM
	`emp_project` p
	LEFT JOIN `architecture` e ON p.id = e.`project_id` 
	AND e.`is_active` = 1 
	AND e.`level` = 30 
	AND e.`source_type` = 'Z'
	LEFT JOIN `project_device` d ON p.id = d.project_id 
	AND d.is_active = 1 
	AND d.device_type IN ( 1, 2, 3, 4 ) 
WHERE
	p.`is_active` = 1 
	AND p.`source_type` = 'Z' 
GROUP BY
	p.id
SELECT
	p.project_code AS 项目编码,
	p.project_name AS 项目名称,
	en.encount AS 建筑数量,
	de.decount AS 设备数量 
FROM
	`emp_project` p
	LEFT JOIN ( SELECT `project_id`, count(*) AS encount FROM `architecture` WHERE `level` = 30 AND `is_active` = 1 
	AND `source_type` = 'Z' GROUP BY `project_id` ) en ON p.id = en.`project_id`
	LEFT JOIN (
	SELECT
		`project_id`,
		count(*) AS decount 
	FROM
		`project_device` 
	WHERE
		`is_active` = 1 
		AND `device_type` IN ( 1, 2, 3, 4 ) 
	GROUP BY
		`project_id` 
	) de ON p.id = de.project_id 
WHERE
	p.`is_active` = 1 
	AND p.`source_type` = 'Z'

这两段 sql 在同一个库里执行,结果天差地别,但是从连接和分组以及查询条件来看,感觉不出来有什么差异,大佬们能不能一眼丁真帮看下原因

2228 次点击
所在节点    Java
33 条回复
hxpmc
97 天前
第二个慢?
bingfengCoder
97 天前
@hxpmc 不是快慢的问题,现在不考虑性能,它们查询结果完全不一样,就是 count 值差别很大,但是从直觉上去读这两个 sql ,总感觉又没毛病
Xinu
97 天前
没去问问 gpt 吗 现在 sql 问题一律先问 gpt
bingfengCoder
97 天前
@Xinu 问过了,结果就是人工智障,它告诉我这是两个相似的 sql ,结果也应该相似。。。。但是实际执行结果 count 相差很大
gerryzhu0033
97 天前
left join 和 right join 后面不要用 where ,用了 where 就变普通 join 了
inkmulberry
97 天前
感觉上应该是第一个 count 更大
houfeibin
97 天前
第二种结果是对的
ZZ74
97 天前
注意 left join
第一句 p 中 project id 就算 e ,d 中没有对应的 也会被 count
第二句 就不会有问题

而且现在 sql 都那么宽泛了吗? 第一句 sql 你 count 的话 不应该是 group by project_code 和 name 为啥要是 id...
怎么说呢 你这两个统计值应该做成两个 sql 用 inner join....
jorinabill111
97 天前
逆天丁真
8355
97 天前
sql1 的 join 2 次纬度差异 导致的 count 数量不对吧
从来没有想过这种魔法的操作

你的主 sql 本身与 e/d 表条件没有任何关联就应该单独直接 sql count
8355
97 天前
@ZZ74 确实 group by 主表 id 的操作还是第一次见。。。 十分之 6
bingfengCoder
97 天前
@inkmulberry 是的,第一个 count 会比较大,但是这种大是不准确的,找不到原因
5sheep
97 天前
笛卡尔乘积造成的
bingfengCoder
97 天前
@ZZ74 试过 group by project_code,name 和 group by id 结果是一样的,count 都不准确。。。。
ZZ74
97 天前
@bingfengCoder
注意这句 注意 left join
第一句 p 中 project id 就算 e ,d 中没有对应的 也会被 count
ivvei
97 天前
语法都不对,这是 mysql 吧?
liprais
97 天前
建议你再学学
真是一眼就能看出区别
mytoroto
97 天前
同意楼上,再学学,你这是基本功有问题啊
mytoroto
97 天前
@mytoroto 回错楼了
bingfengCoder
97 天前
@mytoroto 能细说下吗

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1013155

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX