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

时间:2019-05-08 08:54:16

标签: mysql database list

我有以list_id标识的列表。

每个列表中都有项,用item_id标识,并用position_int排序,并分配给上述list_id

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

如何找出哪些user_id已完全完成了哪些list_id?具体来说,我想知道是否可以使用一个mySQL查询来获取此数据集。

enter image description here

出于方便的考虑,可能还有性能的考虑,我将创建一个表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 个答案:

答案 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按每个用户的每个列表的日期获取第一项。