获取MySQL中最新的状态

时间:2012-06-25 09:47:45

标签: mysql aggregate-functions

我有一件非常奇怪的事情,根本就不知道怎么做。这是我的表及其数据:

+------+-----------+-------------+-------+------------+
| 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

仅返回垃圾数据。我没有想法。有什么帮助吗?

2 个答案:

答案 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”。