【问题标题】:MySQL - Grouping multiple rows where criteria is the sameMySQL - 将条件相同的多行分组
【发布时间】:2016-01-28 18:01:47
【问题描述】:

我有一个电影评级表,其中包含数百万行包含用户 ID、电影 ID 和评级的行。

| userId | movieId | rating |
------------------------------
| 1      | 213     | 5      |
| 1      | 245     | 4      |
| 2      | 213     | 4      |
| 2      | 245     | 4      |
| 3      | 657     | 5      |
| 3      | 245     | 5      |

我正在尝试找出一种将包含匹配的电影 ID 集的用户 ID 组合在一起的方法。理想情况下,我希望查询仅在它们至少有 5 个共同的电影 ID 并且评分高于 4 时才找到匹配项,但我已在此示例中对其进行了简化。

在上面的实例中,userId 1 和 2 将是唯一匹配的用户,因为它们都包含相同的 movieId。我需要一个基本上可以复制这一点的声明。提前感谢您的帮助。

【问题讨论】:

  • 您能分享您尝试过的任何查询的结果吗?
  • 简化很好,但我认为在这种情况下您可能过于简化了。

标签: php mysql grouping rows


【解决方案1】:

您可以对匹配的电影执行自联接,过滤掉评分不高的记录,按用户对分组,然后只过滤结果组,只筛选那些至少有必要数量的匹配记录的组:

SELECT   a.userId, b.userId
FROM     myTable a JOIN myTable b USING (movieId)
WHERE    a.userId < b.userId
     AND a.rating > 4
     AND b.rating > 4
GROUP BY a.userId, b.userId
HAVING   COUNT(*) >= 5

【讨论】:

  • 我喜欢它的外观并认为它可能会起作用,尽管我在查询这么多行时遇到问题,这会使服务器停止运行。
  • @user3612532:表上定义了哪些索引?
  • 只是 ratingId 列上的主键,但我认为它的作用不大。我没有太多的 SQL 经验,所以如果这些都是基本的东西,我很抱歉。
【解决方案2】:
select movieId, rating 
from tablename
group by movieId 
having count(userId) > 1 and rating > 4;

这给了我电影 ID 245 和评分 5,根据您提供的示例数据应该是正确的,有超过 1 个用户 ID 和评分大于 4。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-03-04
    • 2022-01-23
    • 2011-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-28
    相关资源
    最近更新 更多