我有一件非常奇怪的事情,根本就不知道怎么做。这是我的表及其数据:
+------+-----------+-------------+-------+------------+
| uid | entity_id | entity_type | state | created |
+------+-----------+-------------+-------+------------+
| 3913 | 1105 | 1 | 0 | 1340617072 |
| 3913 | 1105 | 1 | 1 | 1340617042 |
| 3913 | 3930 | 1 | 0 | 1340617071 |
| 3913 | 3930 | 1 | 1 | 1340617036 |
+------+-----------+-------------+-------+------------+
created
包含已执行操作的时间戳,state
是操作的状态(关注或取消关注),uid
是谁采取行动,{{1}是被跟踪/取消跟踪的实体ID。
我正在尝试进行一个查询,它会获取当前用户所关注的所有entity_id
。我首先使用的是:
entity_id
但是我注意到如果我跟随某人然后取消关注他们,我仍然得到该人的结果,因为它有2个条目(状态= 1然后状态= 0)。
所以我需要获取最新SELECT entity_id FROM follow_objects WHERE uid=? AND entity_type=?
列的行,这意味着该操作是最新的行。所以我试过了:
created
仅返回垃圾数据。我没有想法。有什么帮助吗?
答案 0 :(得分:1)
您需要选择分组最大。您必须在子选择中包装最大值并将表连接到entity_id
s相等且子选择的最大时间戳等于创建的时间戳的位置。结果是,您将获得每个entity_id
组的顶行数据:
SELECT
a.entity_id,
b.state,
b.created
FROM
(
SELECT entity_id, MAX(created) AS max_created
FROM follow_objects
WHERE uid = ? AND entity_type = ?
GROUP BY entity_id
) a
INNER JOIN
follow_objects b ON
a.entity_id = b.entity_id AND
a.max_created = b.created
答案 1 :(得分:0)
首先选择所有匹配的行,然后按创建日期(最新的第一个)排序,然后从该结果中取出第一个:
SELECT entity_id
FROM (
select entity_id, created
from follow_objects
WHERE uid=?
AND entity_type=?
order by created desc
) x
limit 1
易于理解和编码。
fyi,括号之后的“x”是因为你需要为从中选择的所有结果集赋予别名,所以我把它称为“x”。