MySQL:按一组行限制,而不是按行限制

标签 mysql sql

我有一个 MySQL 表,如下所示。 idname 字段只是在这里帮助识别行,l 代表许多其他不相关数据的字段,而 lat lng 用于查找重复的条目。

CREATE TABLE v
    (`id` int, `lat` int, `lng` int, `l` varchar(3), `name` varchar(8))
;

INSERT INTO v
    (`id`, `lat`, `lng`, `l`, `name`)
VALUES
    ( 1, 12, 12, 'a', 'group1-1'),
    ( 2, 12, 12, 'b', 'group1-2'),
    ( 3, 13, 12, 'c', 'single1'),
    ( 4, 13, 13, 'd', 'group2-1'),
    ( 5, 13, 13, 'e', 'group2-2'),
    ( 6, 13, 13, 'f', 'group2-3'),
    ( 7, 10, 13, 'g', 'group3-1'),
    ( 8, 10, 13, 'h', 'group3-2'),
    ( 9, 11, 12, 'h', 'group4-1'),
    (10, 11, 12, 'h', 'group4-2'),
    (11, 10, 14, 'i', 'group5-1'),
    (12, 10, 14, 'j', 'group5-2'),
    (13, 10, 14, 'j', 'group5-3')
;

现在我想获取所有具有相同纬度和经度值的行(我们称其为一组):

SELECT v.*
FROM v
 INNER JOIN (
  SELECT lat, lng
  FROM v
  GROUP BY lat, lng
  HAVING COUNT(*) > 1
  ) AS vg
  USING (lat, lng)
ORDER BY name
;

输出:

ID  LAT LNG L   NAME
1   12  12  a   group1-1
2   12  12  b   group1-2
4   13  13  d   group2-1
5   13  13  e   group2-2
6   13  13  f   group2-3
7   10  13  g   group3-1
8   10  13  h   group3-2
9   11  12  h   group4-1
10  11  12  h   group4-2
11  10  14  i   group5-1
12  10  14  j   group5-2
13  10  14  j   group5-3

到目前为止效果很好,除“single1”行外,所有行都按组选择和排序。

现在我想添加一个限制来形成这个数据的不同页面。但是同一组的所有行都需要在同一页上(但不是每组一页,一页上实际有多少行并不重要——只是不要太多)。我没有看到使用 LIMIT 语句完成此操作,所以我开始编写自己的语句:

SET @grp := 0, @last_lat := '', @last_lng := '';

SELECT * FROM (
 SELECT v.*,
  @grp := IF((@last_lat = lat) && (@last_lng = lng), @grp, @grp + 1) AS grp,
  @last_lat := lat AS llat,
  @last_lng := lng AS llng
 FROM v
  INNER JOIN (
   SELECT lat, lng
   FROM v
   GROUP BY lat, lng
   HAVING COUNT(*) > 1
   ) AS vg
   USING (lat, lng) 
 ORDER BY lat, lng
) AS vv
WHERE grp BETWEEN 0 AND 7
ORDER BY grp
;

这个去掉 WHERE 部分的查询输出这个数据:

ID  LAT LNG L   NAME        GRP LLAT    LLNG
1   12  12  a   group1-1    6   12  12
2   12  12  b   group1-2    6   12  12
5   13  13  e   group2-2    7   13  13
6   13  13  f   group2-3    7   13  13
4   13  13  d   group2-1    7   13  13
7   10  13  g   group3-1    8   10  13
8   10  13  h   group3-2    8   10  13
10  11  12  h   group4-2    9   11  12
9   11  12  h   group4-1    9   11  12
13  10  14  j   group5-3    10  10  14
11  10  14  i   group5-1    10  10  14
12  10  14  j   group5-2    10  10  14

想法是为每一页更改 WHERE grp BETWEEN 0 AND 7 行中的值。但是该组中的数字不是从 1 开始的,我不明白为什么(这使得它无法用于第一页)。根据整个数据中有多少组,起始编号会有所不同。所以我需要的是,grp 列从 1 开始,然后始终以 +1 继续。

这个查询有什么问题,有什么更好的方法吗?

您可以在这里查询:http://sqlfiddle.com/#!8/86d3c/2

最佳答案

SET @grp := 0, @last_lat := '', @last_lng := '';

SELECT vv.*,@grp-grp+1 as orgGrp FROM (
 SELECT v.*,
  @grp := IF((@last_lat = lat) && (@last_lng = lng), @grp, @grp + 1) AS grp,
  @last_lat := lat AS llat,
  @last_lng := lng AS llng
 FROM v
  INNER JOIN (
   SELECT lat, lng
   FROM v
   GROUP BY lat, lng
   HAVING COUNT(*) > 1
   ) AS vg
   USING (lat, lng) 
 ORDER BY lat, lng
) AS vv

ORDER BY orgGrp
;

SQLFIDDLE

关于MySQL:按一组行限制,而不是按行限制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16569293/

相关文章:

php - 使用 php 选择不同的结果给出了错误的结果

mysql - 将 varchar 转换为整数

php - 显示两个日期之间的记录

c# - 在 MySql 中读/写 unicode 数据

java - 行号为 Object[][] 的 RecordSet?

PHP 搜索 MySQL 数据库错误

mysql - 如何将多个select语句合并到一个表中

SQL - 如何使用 WHERE 代替 LEFT/RIGHT JOIN?

sql - 如何在 hive 中结合拆分和计数

mysql - 如何减少这个查询(SQL)?