MySQL 查询通过字段的唯一值设置 LIMIT
MySQL query set LIMIT by unique values of a field
我有一个 MySQL table 看起来像这样
---------------------------------------
|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>
并不总是相同的,所以不妨在这里忽略它。那将 return 前 50 个条目。
在这种情况下,我需要它 return 前 n
行最多有 50 个唯一的 setID。
这意味着如果我们查看上面的 table 并将此自定义 "LIMIT" 设置为“2”,它将 return 前 3 行。如果 LIMIT 为“3”,则必须 return 所有 4 行(因为 id
2 和 3 共享相同的 setID)。
如果我使用 GROUP BY setId
,自定义 LIMIT 会起作用,但它根本不会 return id
为 3 的行。
实现该目标的最佳 SQL 字符串是什么?非常感谢帮助。
编辑
table 已由 setId
订购,因此无需在此处使用任何 ORDER BY
。
edit2
正如评论中所说,最好的方法可能是:
"One full copy of the results is joined against a second copy of the results that uses GROUP BY and JOIN to find the first 50 setIDs."
遗憾的是我对 SQL 语法不是很熟悉,有人知道这样做的好方法吗?非常感谢。
这个查询应该可以解决问题:
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
的记录。
编辑问题的作者提到
table is already ordered by setId, so no need to use any ORDER BY here
。表本身没有排序,如果我们使用不带 order by
的查询,则无法保证顺序。虽然,实际顺序很可能是添加行的顺序,但您不能依赖于此。只有order by
构造才会保证结果集的顺序
我有一个 MySQL table 看起来像这样
---------------------------------------
|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>
并不总是相同的,所以不妨在这里忽略它。那将 return 前 50 个条目。
在这种情况下,我需要它 return 前 n
行最多有 50 个唯一的 setID。
这意味着如果我们查看上面的 table 并将此自定义 "LIMIT" 设置为“2”,它将 return 前 3 行。如果 LIMIT 为“3”,则必须 return 所有 4 行(因为 id
2 和 3 共享相同的 setID)。
如果我使用 GROUP BY setId
,自定义 LIMIT 会起作用,但它根本不会 return id
为 3 的行。
实现该目标的最佳 SQL 字符串是什么?非常感谢帮助。
编辑
table 已由 setId
订购,因此无需在此处使用任何 ORDER BY
。
edit2
正如评论中所说,最好的方法可能是:
"One full copy of the results is joined against a second copy of the results that uses GROUP BY and JOIN to find the first 50 setIDs."
遗憾的是我对 SQL 语法不是很熟悉,有人知道这样做的好方法吗?非常感谢。
这个查询应该可以解决问题:
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
的记录。
编辑问题的作者提到
table is already ordered by setId, so no need to use any ORDER BY here
。表本身没有排序,如果我们使用不带 order by
的查询,则无法保证顺序。虽然,实际顺序很可能是添加行的顺序,但您不能依赖于此。只有order by
构造才会保证结果集的顺序