我有一张表格,其中包含在进入系统,审核期间以及关闭时询问的问题的答案。客户端可以在系统生命周期内多次打开和关闭。
我正在尝试从表格中获取最新的“条目”结果,该结果也包含相关的“评论”或“结果”结果。
这是我的表(我刚刚包含了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行上的“条目”后面没有任何“审核”或“关闭”记录。
希望这是有道理的。
答案 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
,例如如果同一日期entry
和review
同时发生,则无法通过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))