如果有评论或关闭条目,请返回最新的参赛结果

时间:2016-08-02 14:09:47

标签: mysql

我有一张表格,其中包含在进入系统,审核期间以及关闭时询问的问题的答案。客户端可以在系统生命周期内多次打开和关闭。

我正在尝试从表格中获取最新的“条目”结果,该结果也包含相关的“评论”或“结果”结果。

这是我的表(我刚刚包含了1个用户,但实际的表有数千个用户):

row | user_id | answer | type   | date_entered |
----+---------+--------+--------+--------------+
 1  |   12    |   3    | entry  | 2016-03-13   |
 2  |   12    |   1    | review | 2016-03-14   |
 3  |   12    |   7    | review | 2016-03-16   |
 4  |   12    |   7    | close  | 2016-03-17   |
 5  |   12    |   8    | entry  | 2016-03-20   |
 6  |   12    |   2    | review | 2016-03-21   |
 7  |   12    |   3    | close  | 2016-03-22   |
 8  |   12    |   1    | entry  | 2016-03-28   |

因此,对于此表,查询将返回第5行,因为第8行上的“条目”后面没有任何“审核”或“关闭”记录。

希望这是有道理的。

3 个答案:

答案 0 :(得分:1)

SELECT a.* 
  FROM my_table a 
  JOIN 
     ( SELECT x.user_id
            , MAX(x.date_entered) date_entered 
         FROM my_table x 
         JOIN my_table y 
           ON y.user_id = x.user_id 
          AND y.date_entered > x.date_entered 
          AND y.type IN ('review','close') 
        WHERE x.type = 'entry' 
        GROUP 
           BY x.user_id 
     ) b 
    ON b.user_id = a.user_id 
   AND b.date_entered = a.date_entered;

答案 1 :(得分:0)

基本上,您可以将查询分成两个子查询。第一个查询应该获得最新的记录ID(审查和关闭)。第二个查询应该有row_id > found_id

SELECT * 
FROM   my_table 
WHERE  type = 'entry' 
       AND row_id > (SELECT Max(row_id) 
                     FROM   my_table 
                     WHERE  ( type = 'review' 
                               OR type = 'close' )) 
  

请注意;子查询可能会返回零集。

答案 2 :(得分:0)

我可以想到几种方法。但首先要注意的是:您的date_entered字段似乎只是一个日期。告诉我们发生了什么"以后"我将使用row,例如如果同一日期entryreview同时发生,则无法通过date_entered告知哪一个更晚。

我只列出了几个解决方案。第一个可能更有效,但你应该测量。

这是一个针对子查询的连接:

SELECT
    m1.*
FROM
    mytable m1
    JOIN (SELECT
              row, user_id
          FROM
              mytable
          WHERE
              type IN ('review', 'close') AND
              user_id = 12
          ORDER BY row DESC LIMIT 1) m2 ON m1.user_id = m2.user_id
WHERE
    m1.user_id = 12 AND
    m1.row < m2.row
ORDER BY
    row DESC LIMIT 1

这里是max:

的子查询
SELECT
    *
FROM
    mytable
WHERE
    row = (SELECT
               MAX(m1.row)
           FROM
               mytable m1,
               mytable m2
           WHERE
               m1.user_id = m2.user_id AND
               m1.type = 'entry' AND
               m2.type IN ('review', 'close') AND
               m1.row < MAX(m2.row))