繁体   English   中英

告诉3个或更多连续记录缺失的最佳方法

[英]Best way to tell 3 or more consecutive records missing

我正在实施一个成就系统。 我正在尝试创建的“徽章”之一将决定:

  1. 如果用户已加入至少一个编码挑战
  2. 然后还没有加入3连续的编码挑战
  3. 然后又开始参与了。

徽章简称为“我会回来”;-)

表格

users
==================
id    fullname
1     Gary Green


challenge
==================================
id  name         start_date
1   challenge1   01-AUG-2010
2   challenge2   03-AUG-2010
3   challenge3   06-SEP-2010
4   challenge4   07-SEP-2010
5   challenge5   30-OCT-2010
6   challenge6   05-NOV-2010


entries
====================================================
id   challengeid    userid    type       code
1     1             1         1          -
2     2             1         1          -
3     6             1         1          -
4     6             1         2          -

条目表中的“类型”是指条目类型是基于非正则表达式的条目还是基于正则表达式的条目。 用户可以提交正则表达式和非正则表达式条目,因此挑战6的上述条目是有效的。

示例输出

这是我想要的查询的样式输出(在这种情况下应该授予徽章):

(for userid 1)
Challenge 1 --> Joined in
Challenge 2 --> Joined in
Challenge 3 --> NULL
Challenge 4 --> NULL
Challenge 5 --> NULL
Challenge 6 --> Joined in

怎么样?

这是我的问题

  1. 什么是在查询中执行此操作的最佳方法?
  2. 有没有我可以在MySQL中使用的函数来选择这个范围而不需要使用某些PHP?

到目前为止的查询

我正在进行LEFT OUTER JOIN以加入挑战表和条目表(LEFT OUTER以确保保留用户未加入的挑战),然后按挑战start_date排序以查看用户是否尚未加入3或更多连续挑战。

SELECT challenge.id AS challenge_id, entries.id AS entry_id
FROM challenge_entries entries
LEFT OUTER JOIN challenge_details challenge
 ON entries.challengeid = challenge.id
WHERE entries.userid = <user_id>
ORDER BY challenge.start_date
GROUP BY entries.challengeid

重要的编辑:要使这个徽章有意义,标准将需要连接3个或更多连续挑战,这些挑战被加入到了上面的示例输出中。 否则,任何第一次参加挑战的人都将自动收到徽章。 必须让用户远离参与挑战一段时间(> = 3)

我认为你需要使用另一个表开始......

SELECT challenge.id AS challenge_id, entries.id AS entry_id FROM challenge_details challenge
LEFT JOIN challenge_entries entries ON entries.challengeid = challenge.id and entries.userid = <user_id>
ORDER BY challenge.start_date

添加组可以按照您的意愿完成...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM