【问题标题】:group by but counting just active rows-SQL分组但只计算活动行-SQL
【发布时间】:2014-07-12 04:10:53
【问题描述】:

我有以下表格:

scenes
------
scene_id
title
video_url
modified_at
uuid


likes
----
scene_id
uuid
active


users
-----
uuid
username

问题 1: 我想按降序获取场景、scene_id、作者的点赞数;请注意,我们只需要计算点赞表中活跃的点赞数!

我的尝试:

SELECT s.scene_id,s.video_url,s.title,s.uuid, u.username as author,s.data,count(l.active) as likes

 FROM scenes s
    left join likes l
        on l.scene_id = s.scene_id
    join users u
        on u.uuid = s.uuid
  where s.video_url  IS not NULL
  group by s.scene_id
  order by modified_at DESC;

但这是计算所有的喜欢,不管它是否活跃!我不知道如何在我的查询中添加那个!

问题 2:

我还想知道是否可以在结果集中添加另一列来显示特定用户(可以在 where 子句中传递和使用 uuid)是否喜欢结果集中的每个场景?是否可以仅在一个查询中获得此结果?

如果您需要更多说明,请告诉我!

谢谢!

【问题讨论】:

  • ?????总和?????? - 或 ELSE NULL
  • 嗯;好人!现在我尝试了 sum(l.active) 并且它正在工作!但是如果它不喜欢它会返回 null,所以我尝试了 ISNULL(sum(l.active)) 并给了我错误!任何想法?你对问题 2 也有任何想法吗?
  • 还尝试了 SUM(ISNULL(l.active, 0)) 并显示:调用本机函数 'ISNULL' 时参数计数不正确
  • 'active' 列的可能值是多少,即如何指定 active like?
  • 有几个选项。这是一个:COALESCE(SUM(x=y),0)

标签: mysql sql


【解决方案1】:

active 列上添加谓词很简单;它只是取决于它是如何表示的......是一个整数类型列,使用 0 和/或 NULL 表示它是“非活动的”,使用 1 和/或任何正整数表示它是active

要获得“场景的喜欢数,scene_id,作者按降序排列”,您可以执行以下操作:

SELECT COUNT(l.scene_id) AS cnt_likes
     , s.scene_id        AS scene_id
     , a.username        AS author
  FROM scenes s
  LEFT
  JOIN users a
    ON a.uuid = s.uuid
  LEFT
  JOIN likes l 
    ON l.scene_id = s.scene_id 
   AND l.active+0
 GROUP BY s.scene_id
 ORDER BY cnt_likes DESC, s.scene_id DESC, a.username DESC

如果active 列是字符类型,并且您使用“yes”值表示喜欢是活动的,则需要更改谓词,

替换:

   AND l.active+0

与:

   AND l.active = 'yes'

等等


对于第二个问题,识别对某个场景有“活跃点赞”的用户

(即聚合中包含的行),这是有问题的,因为可能有多个用户对一个场景有一个点赞......我们确定哪些用户要返回,只是其中任何一个,所有这些用户? ...我只是更仔细地重新阅读了您的问题。您想知道某个特定的已识别用户是否有该场景的 like

只需测试like 行上的uuid 是否等于您要查找的值,并返回0 或1,然后获取它的MAX()。

例如

SELECT COUNT(l.scene_id)         AS cnt_likes
     , s.scene_id                AS scene_id
     , a.username                AS author
     , MAX(l.uuid = 'auser')     AS liked_by_user
  FROM scenes s
  LEFT
  JOIN users a
    ON a.uuid = s.uuid
  LEFT
  JOIN likes l
    ON l.scene_id = s.scene_id 
   AND l.active+0
 GROUP BY s.scene_id
 ORDER BY cnt_likes DESC, s.scene_id DESC, a.username DESC

跟进

表达式

     MAX(l.uuid = 11 )

可以返回 1、0 或 NULL。 (1 相当于布尔 TRUE,0 相当于布尔 false,NULL 是未知的,或者在这种情况下,我们也将其视为 FALSE。

在 MySQL 中,整数可以作为布尔值处理,布尔值作为整数处理。

要返回字符串 'true' 或 'false',您可以使用 IF() 函数

     IF(MAX(l.uuid = 11 ), 'true', 'false')

【讨论】:

  • 好人!对于第二个问题!我在后端得到了一个 uuid,当我列出场景时,在最后一列中我只需要说明我作为输入获得的用户(uuid)是否喜欢 uuid=10 喜欢输出结果中的哪些 senes跨度>
  • @user3399784:您确实解释得很好,您实际上在原始问题中解释了它,我只是错过了。我已经更新了我的答案,以展示一种方法。 (显然,有不止一种解决方案,我只是展示了一种方法。)(如果active 是整数类型,您可以省略谓词上的“+0”;如果它处于活动状态,我们会想要它是字符类型,'0','1')
  • 你太棒了!非常感谢您的帮助!
  • @user3399784:另外,如果您不关心任何“零”计数,您可以使用[INNER] JOIN 操作,而不是LEFT [OUTER] JOIN。我很高兴你发现我的回答很有帮助。我不确定为什么你的问题被否决了,这对我来说似乎是个好问题。)
  • @user3399784:在 MySQL 中,布尔表达式返回整数(NULL 表示未知,0 表示 FALSE,1 表示 TRUE)。整数也可以被视为布尔值:NULL 为 NULL,0 为 FALSE,其他值为 TRUE。如果你想返回字符串值'true'/'false'...你可以使用IF()函数:IF(MAX(l.uuid = 11),'true','false')
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-18
  • 2019-08-29
  • 2016-06-16
  • 1970-01-01
相关资源
最近更新 更多