MYSQL:COUNT与GROUP BY,LEFT JOIN和WHERE子句不返回零值
技术问答
323 人阅读
|
0 人回复
|
2023-09-13
|
我敢肯定,这是一个非常简单的答案,但是我似乎找不到它(不确定要搜索的内容!)。标准计数/按查询分组可能如下所示:
3 r! z) U" V; Y: d8 N9 ~SELECT COUNT(`t2`.`name`)
5 E. P/ A# T! ^. EFROM `table_1` `t1` 9 k( c( M/ X) \
LEFT JOIN `table_2` `t2` ON `t1`.`key_id` = `t2`.`key_id` / E* z# g$ G5 M
WHERE `t1`.`another_column` = 123
5 x4 Y2 }6 h/ B; V并按预期方式工作,如果未找到任何行,则返回0。然而:
5 n- B- d" H: Z6 mSELECT COUNT(`t2`.`name`)
) k$ C& p: a6 l7 o9 E5 s% R8 eFROM `table_1` `t1` ; H1 h" S$ b, d8 M/ g, Z- z# ~- Z2 V
LEFT JOIN `table_2` `t2` ON `t1`.`key_id` = `t2`.`key_id`
3 [- h0 [& b$ ~3 s. w/ I lWHERE `t1`.`another_column` = 123
: L. X1 l3 X# x4 g! w8 F4 _% SGROUP BY `t1`.`any_col`
& j/ L3 w3 d( [/ A: k仅当table_1中至少有一行时才有效,而如果行数为零,则失败地返回空结果集。我真的很想返回0!有人启发我吗?如果您在伦敦,可以提供啤酒作为交换;-)/ z2 [$ G* x' y& r7 g
1 {& ~- ` E: T( D/ d) U" b
解决方案:7 v4 m9 e8 C/ X N% D& P
0 m+ }3 O4 T: P A" w- Q) ^
+ c$ E0 ?8 j3 k9 v# W6 ]! E/ \* a6 i% y; ~7 e1 Y7 Z- ]/ f4 d3 [
它返回零行的原因是您正在对table_1中的值进行分组。由于table_1中没有值,因此没有要返回的行。换句话说,如果您从GROUP
5 r9 k: [4 ~ A0 fBY中返回查询中的t1.any_col像这样:
6 Q' R" @" I6 n* I" uSELECT `t1`.`any_col`, COUNT(`t2`.`name`)
/ T9 N4 Z+ j0 d, {3 ]FROM `table_1` `t1` 1 f( V& h/ i u
LEFT JOIN `table_2` `t2` ON `t1`.`key_id` = `t2`.`key_id` , h0 Y5 h. B2 N9 \* e
WHERE `t1`.`another_column` = 123 % a1 {9 q1 n' F* {7 `3 |
GROUP BY `t1`.`any_col`
* F% S6 h2 M. H5 R& H5 M没有行时,t1.any_col将显示什么?实现所需目标的唯一方法是将结果与另一个检查table_1中没有行的查询合并。在此示例中,我仅使用INFORMATION_SCHEMA视图来查询某些内容。1 A/ C, q" G# \$ l* e6 I
SELECT COUNT(`t2`.`name`)
/ P* D/ [$ x3 N" oFROM `table_1` `t1`
* T$ u3 o9 @( w! m' T: x' a LEFT JOIN `table_2` `t2` ON `t1`.`key_id` = `t2`.`key_id` 0 \5 f3 m) }* |5 a; S; a, T
WHERE `t1`.`another_column` = 123
" c0 i" q8 z" o# C, i! o) E! k) rGROUP BY `t1`.`any_col`
7 A8 J9 m% g+ Q# q1 ? R3 TUNION ALL
" [( z% P. J% v, e5 YSELECT 0
) H5 G+ t/ Y' J4 }+ wFROM INFORMATION_SCHEMA.TABLES; A" e7 Q# _) _! G' P
Where Not Exists( Select 1 From `table_1` )+ O) j' Q' M' q$ _
LIMIT 1 |
|
|
|
|
|