回答

收藏

在一个查询中计算MySQL中的多行

技术问答 技术问答 438 人阅读 | 0 人回复 | 2023-09-14

我目前有一个表,用于存储大量项目的统计数据,例如视图,下载,购买等。为了对每个项目进行一次操作计数,我可以使用以下查询:
$ U7 }' N* @2 e9 q" ISELECT *, COUNT(*)# X# Q: W, A4 S3 R3 ^
FROM stats2 I# w& K$ K! e+ v0 U% J6 y0 G
WHERE operation = 'view'
& u: o) ]: c) fGROUP BY item_id7 ?) {4 f; v) d8 {8 y
这给了我所有的内容以及他们的看法。然后,我可以将其他变量的“视图”更改为“购买”或“下载”。但是,这意味着对数据库的三个单独的调用。
& g4 H, e1 Q* o% ?" D  U一口气拿下所有三个都可以吗?
' A+ [' D  O# ~1 e. H* X/ N  j" b                ' P0 O# S1 Y& A
解决方案:4 G/ e6 Y4 o0 H
               
6 ?% t* L% |: ?- ?2 e7 m. m
" O; d1 L7 {1 w5 Q! j8 X1 C% j& Y
1 j+ Q7 \4 G: U& u; x5 Y                SELECT item_id, operation, COUNT(*) 1 @& ~- e; v$ ?  R
FROM stats 3 a9 o: m! _2 e% M: d: X
WHERE operation IN ('view','purchase','download') 4 M! [9 h; ^0 \' R
GROUP BY item_id, operation
$ k! f# V  J# p9 X' |! e( e4 D. B将返回一个表, 其中每个item_id和operation一行一行 ,包含三列:item_id,操作类型以及具有该item_id的行数。7 N: T& }. i0 p7 S0 i) c
1 view 3
! _2 {$ t% Y" [% t& ?2 }( D) l1 purchase 5
  j! b# o; l4 v4 K8 @" G2 download 7* S9 c0 j* e6 z
3 download 1# g# V% @) [- U8 J3 n
如果需要所有item_id,则可以省略WHERE,并且可以订购COUNT(*)以获取最受欢迎的商品。取决于您要查找的内容或如何使用数据。
. a# w& _4 V& H1 O如果您希望各列 彼此相邻 ,请使用IF:
6 S' ?, X+ @$ U/ P! G; CSELECT s1.item_id, SUM( IF( s1.operation = 'view', 1, 0 ) ) views, SUM( IF( s1.operation = 'download', 1, 0 ) ) downloads, SUM( IF( s1.operation = 'purchase', 1, 0 ) ) purchases
- X( z! P5 ^& k5 J) LFROM stats s1# q6 l- H0 f7 f
GROUP BY s1.item_id/ F* {& V1 q" Y( J, q, E. `1 R
item_id | views | downloads | purchases
, V6 v! k! M6 T8 {8 W+ O: e' M  p1 | 3 | 0 | 5
& X; R- x0 _0 x3 M7 q/ m+ j, d- C2 | 0 | 7 | 07 Z' g% O5 I" G9 e% ~" O
3 | 0 | 1 | 0
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则