MySQL查询通过字段的唯一值设置LIMIT

时间:2015-01-03 16:29:28

标签: mysql

我有一个看起来像这样的MySQL表

---------------------------------------
|id      |setId   |value1   |value2   |
---------------------------------------
|1       |1       |value1   |value2   |
|2       |2       |value1   |value2   |
|3       |2       |value1   |value2   |
|4       |3       |value1   |value2   |
---------------------------------------

基本上有很多条目(上面只是一个示例),其中包含唯一的IDs,但许多条目具有相同的"setID"

现在让我说我有以下代码:

SELECT * FROM table WHERE <rule> LIMIT 0,50

<rule>并不总是一样,所以也可以忽略它。这将返回前50个条目。

在这种情况下,我需要它返回最多50个唯一setID的第一个n行 这意味着如果我在上面的表中将这个自定义“LIMIT”设置为“2”,它将返回前3行。如果LIMIT为“3”,则必须返回所有4行(因为id 2和3共享相同的setID)。

如果我使用GROUP BY setId自定义LIMIT可以工作,但它不会返回id为3的行。

实现这一目标的最佳SQL字符串是什么?非常感谢帮助。

修改 该表已按setId排序,因此无需在此处使用任何ORDER BY

EDIT2 正如评论中所说,这样做的最佳方式可能是:
“结果的一个完整副本连接到结果的第二个副本,该副本使用GROUP BY和JOIN来查找前50个setID。”

遗憾的是我不熟悉SQL语法,有谁知道这样做的好方法?非常感谢。

1 个答案:

答案 0 :(得分:3)

此查询应该可以解决问题:

select * from table t,
(select distinct tt.setId from table tt order by tt.setId limit 50) sets
 where t.setId = sets.setId 
order by t.Id

sets子查询中,我们找到了所有setId所需的内容(前50个唯一的),然后在where子句中我们告诉MySQL我们只想获取记录使用这些setId

编辑问题的作者提到了

  

表已经由setId排序,所以不需要在这里使用任何ORDER BY

。表本身没有排序,如果我们使用不带order by的查询,则无法保证顺序。但是,实际订单很可能是添加行的顺序,您不能依赖于此。只有order by构造才能保证结果集的顺序。