我有一个看起来像这样的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。”
答案 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
构造才能保证结果集的顺序。