【问题标题】:MySQL SELECT Multiple DISTINCT COUNTMySQL SELECT 多个 DISTINCT COUNT
【发布时间】:2012-10-16 15:43:13
【问题描述】:

这就是我想要做的。我有一个包含重复行的用户评估表。我希望只为每个用户获取 DISTINCT 值。

在下表的示例中。如果只有 user_id 1 和 50 属于特定位置,则只有每个用户的唯一 video_id 应作为 COUNT 返回。用户 1 传递了视频 1、2 和 1。所以应该只有 2 条记录,而用户 50 传递了视频 2。所以这个位置的总数是 3。我想我需要在查询中有两个 DISTINCT's,但不知道该怎么做。

+-----+----------+----------+
| id  | video_id | user_id  |
+-----+----------+----------+
| 1   |       1  |        1 |
| 2   |       2  |       50 |
| 3   |       1  |      115 |
| 4   |       2  |       25 |
| 5   |       2  |        1 |
| 6   |       6  |       98 |
| 7   |       1  |        1 |
+-----+----------+----------+

这是我当前查询的样子。

$stmt2 = $dbConn->prepare("SELECT COUNT(DISTINCT user_assessment.id)
FROM user_assessment
LEFT JOIN user ON user_assessment.user_id = user.id
WHERE user.location = '$location'");
$stmt2->execute();
$stmt2->bind_result($video_count);
$stmt2->fetch();
$stmt2->close();

所以我的查询会返回该特定位置的所有计数,但不会忽略来自每个特定用户的非唯一结果。

希望这是有道理的,感谢您的帮助。

【问题讨论】:

  • 没有解决方案,只有优化:使用 INNER JOIN。它比 LEFT JOIN 快,而且效果是一样的,因为你在 WHERE 子句中使用了连接表。
  • 您知道 SQL 查询中允许换行吗?
  • @GolezTrol,是的,谢谢。这就是我复制丢失换行符的代码的方式。我已经编辑了我的帖子,使其更易于阅读。
  • @Jako 。 . .您的描述和您的示例查询/数据彼此无关。您使用“位置”和“视频”之类的词,但查询中没有这些词。您能否修改问题以使其更清楚您想要什么?
  • @GordonLinoff 很抱歉,稍微调整了问题以提供帮助。

标签: mysql


【解决方案1】:
SELECT COUNT(DISTINCT ua.video_id, ua.user_id)
FROM user_assessment ua
INNER JOIN user ON ua.user_id = user.id
WHERE user.location = '$location'

你可以在COUNT 中写很多东西,所以不要犹豫,把你真正想要的东西放进去。这将给出不同情侣的数量(video_id, user_id),如果我理解正确,这就是你想要的。

【讨论】:

  • +1 我不确定,也没有手头可以测试的数据库,但如果这可行,它比我的答案要好。更紧凑、更清晰并且可能更快。
【解决方案2】:

下面的查询加入了一个子查询,该查询为每个用户提取不同的视频。然后,主查询对这些数字进行求和,以获得该位置的视频总数。

SELECT 
  SUM(video_count)
FROM 
  user u
  INNER JOIN 
  ( SELECT
      ua.user_id,
      COUNT(DISTINCT video_id) as video_count
    FROM
      user_assessment ua
    GROUP BY
      ua.user_id) uav on uav.user_id = u.user_id
WHERE 
  u.location = '$location'

注意,既然您已经使用了绑定,您还可以在绑定参数中传递$location。我把这个留给你,因为它不是问题的一部分。 ;-)

【讨论】:

  • 您先生是个天才,效果很好。非常感谢您的帮助!
猜你喜欢
  • 2015-01-28
  • 2012-10-13
  • 2016-08-14
  • 1970-01-01
  • 1970-01-01
  • 2017-12-19
  • 1970-01-01
  • 1970-01-01
  • 2013-09-28
相关资源
最近更新 更多