哪些用户完成了列表:如何以尽可能少的步骤查询?
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_int
和 list_id
也在每一行中。
如果存在一行,则该项目已由用户完成。否则,不存在记录。
我怎样才能知道哪个user_id
已经完全完成了哪个list_id
?具体来说,我想知道是否可以使用一个 mysql 查询来获取此数据集。
出于方便和性能考虑,我将创建一个表completed_lists
,其中包含已完全完成的每个列表的list_id
和user_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 的数据然后循环它的方法要好得多...... 没问题。有时,您只需要换一种方式看待问题,解决方案就会跳出来。以上是关于哪些用户完成了列表:如何以尽可能少的步骤查询?的主要内容,如果未能解决你的问题,请参考以下文章
SAP BASIS如何查询指定的用户在SAP系统上做了哪些操作?
业务逻辑:完成认证用户的动态授权功能 完成Shiro整合Ehcache缓存权限数据