限制多个字段的结果(MySQL)

时间:2012-01-26 16:20:09

标签: php mysql sql-order-by

我的表格结构如下:

      mid   | tid  | data
    | 1     | 0    |  data
    | 1     | 1    |  data
    | 1     | 2    |  data
    | 1     | 3    |  data
    | 1     | 4    |  data
    | 2     | 0    |  data
    | 2     | 1    |  data
    | 3     | 0    |  data
    | 3     | 1    |  data
    | 3     | 2    |  data
    | 4     | 0    |  data
              .
              .
              .
    | N     | 0    |  data
    | N     | 1    |  data
    | N     | 2    |  data
              .
              .
    | N     | K    |  data

每条记录由2个索引标识,即mid和tid。每个中间的tid都是独一无二的。对于每个中间,tid从0开始向上计数到K.对于给定的mid,可能会有很多时间,并且可以有无数个中频。

我想要做的是选择3个最新的MID及其相应的最新tid数据符合某些条件(例如> 1)。如果仅MID 1,2,3和4满足数据要求,我希望它返回(省略1,因为它不是最近的3,而是第4):

    | 2     | 1    |  data
    | 3     | 2    |  data
    | 4     | 0    |  data

我迷失了如何做到这一点,任何帮助将不胜感激。 LIMIT 3的双重订单将返回

    | 3     | 1    |  data
    | 3     | 2    |  data
    | 4     | 0    |  data

2 个答案:

答案 0 :(得分:2)

JOIN针对每个MAX(tid)得到mid的子查询:

SELECT 
  t.mid,
  t.tid,
  t.data
FROM tbl t JOIN (
  SELECT mid, MAX(tid) AS maxtid FROM tbl GROUP BY mid
) m ON t.mid = m.mid AND t.tid = m.tid
/* WHERE (some condition) */
ORDER BY t.mid DESC
LIMIT 3

更新:添加了ORDER BY& LIMIT条款,我在OP中错过了。

答案 1 :(得分:0)

您可以这样做:

SELECT * FROM data_table
WHERE
  mid IN (SELECT DISTINCT mid FROM data_table ORDER BY mid DESC LIMIT 3) AND 
  data > 1