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

时间:2010-11-10 11:45:39

标签: php mysql select

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

  1. 如果用户已加入至少一项编码质询
  2. 然后没有加入3连续编码挑战
  3. 然后又开始参与。
  4. 徽章简称为“我会回来”; - )

    表格

    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?

    3. 到目前为止的查询

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

      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个或更多连续挑战,这些挑战被加入了,例如上面的示例输出。否则,任何第一次参加挑战的人都将自动收到徽章。必须让用户远离参与挑战一段时间(&gt; = 3)

1 个答案:

答案 0 :(得分:1)

我认为你需要使用另一张桌子来开始......

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

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