我有以list_id
标识的列表。
每个列表中都有项,用item_id
标识,并用position_int
排序,并分配给上述list_id
。
现在,我有一个名为completed_items
的表。
包含每个item_id
完成的每个user_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)并循环很多次。有更好的方法吗?
答案 0 :(得分: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
对于您的“加分”部分,您需要提供有关表结构的更多详细信息,以便确定排除较新条目的规则。
例如,如果您有某种时间戳或索引,则可以使用density_rank按每个用户的每个列表的日期获取第一项。