哪些用户完成了列表:如何以尽可能少的步骤查询?

Posted

技术标签:

【中文标题】哪些用户完成了列表:如何以尽可能少的步骤查询?【英文标题】:Which users completed a list: How do I query this in as few steps as possible? 【发布时间】:2019-09-25 23:08:34 【问题描述】:

我有列表,标识为list_id

每个列表都有项目,用item_id标识,用position_int排序,并分配给前面提到的list_id

现在,我有一个名为completed_items 的表。 包含每个user_id 已完成的每个item_id 的记录。对于冗余,position_intlist_id 也在每一行中。 如果存在一行,则该项目已由用户完成。否则,不存在记录。

我怎样才能知道哪个user_id 已经完全完成了哪个list_id?具体来说,我想知道是否可以使用一个 mysql 查询来获取此数据集。

出于方便和性能考虑,我将创建一个表completed_lists,其中包含已完全完成的每个列表的list_iduser_id

看起来很简单,我应该能够一口气创建这样的数据集,而不是进入并循环超过一百万个嵌套循环。

这是我目前的方法:

FOREACH list_id

      array_of_items = [all, items, from, list, id];

      FOREACH user_id
        users_items = [];
        push items into users_items
        if length of array_of_items and users_items is the same
        then create a row in completed_lists
      


我不喜欢这种方法的原因是因为我对数据库进行了许多单独的查询(获取每个项目,获取每个用户 ID)并且循环了很多次。有没有更好的办法?

【问题讨论】:

【参考方案1】:

一个好的方法可能是使用 count(*) 和 GROUP BY。 因此,您可以计算已完成表中每个列表中每个用户的答案行数,然后加入一个子查询,从而获得列表中项目的总数。

类似这样的:

select user_id, c.list_id, count(user_id) as list_count, case when item_total-count(user_id)=0 then 'Complete' else 'Incomplete' end as list_status 
from completed c
left join (select list_id, count(*) as item_total from items group by list_id) aa on aa.list_id=c.list_id
group by user_id, c.list_id, item_total

对于您的“奖励积分”部分,您需要提供有关表格结构的更多详细信息,以确定排除较新条目的规则。

如果您有某种时间戳或索引,例如,您可以使用 dense_rank 按每个用户每个列表的日期获取第一项。

【讨论】:

我希望我能加倍支持,非常感谢,我根据我的特定用例对其进行了调整,效果非常好! :-) 在此配置中巧妙地使用计数、大小写、左连接和分组!比我原来一次获取一个 ID 的数据然后循环它的方法要好得多...... 没问题。有时,您只需要换一种方式看待问题,解决方案就会跳出来。

以上是关于哪些用户完成了列表:如何以尽可能少的步骤查询?的主要内容,如果未能解决你的问题,请参考以下文章

有没有办法确定用户加入了哪些多用户会议 (MUCH)?

SAP BASIS如何查询指定的用户在SAP系统上做了哪些操作?

业务逻辑:完成认证用户的动态授权功能 完成Shiro整合Ehcache缓存权限数据

如何使用急切加载来查询尽可能少的数据?

如何在JAVA JPA Spring Boot中的一个SQL查询中选择多个数据

性能测试基础概念1