mysql - 合并前消除重复项

标签 mysql sql union limit

我需要运行一个查询,从一个大表中选择两列(3m+ 行,选择两列,结果集大约为 6-7m)并返回一个列表。所以我使用 union 将列合并到列表中并消除重复项。问题是我无法在一个查询中返回结果,我需要对其进行分区,因此我将 LIMIT ?,? 应用于应用层通过 Prepared Statements 设置的子查询。

SELECT val
FROM 
(
    (SELECT fs.smr as val
    FROM `fr_search` as fs
    ORDER BY val LIMIT ?,?)

    UNION

    (SELECT fs.dmr as val
    FROM `fr_search` as fs
    ORDER BY val LIMIT ?,?)
) as vals
GROUP BY val

问题:并集消除了重复项,但仅在应用 LIMIT 之后。含义 如果两个查询返回 100+100=200 行并且其中大部分是重复的,我只返回 <200 行。我怎样才能对这样的查询应用限制,我可以返回特定数量的行? (如果我在子查询之后应用LIMIT,运行时间将超过两分钟,所以不能解决问题。)

最佳答案

您实际上不需要子查询。以下内容适用于前 100 行:

 (SELECT DISTINCT fs.smr as val
  FROM `fr_search` as fs
  ORDER BY val
  LIMIT 100
 )
 UNION
 (SELECT DISTINCT fs.dmr as val
  FROM `fr_search` as fs
  ORDER BY val
  LIMIT 100
 )
 ORDER BY val
 LIMIT 100;

但是,一旦开始使用偏移量,事情就会变得更加复杂。对于接下来的 100 行:

 (SELECT DISTINCT fs.smr as val
  FROM `fr_search` as fs
  ORDER BY val
  LIMIT 200
 )
 UNION
 (SELECT DISTINCT fs.dmr as val
  FROM `fr_search` as fs
  ORDER BY val
  LIMIT 200
 )
 ORDER BY val
 LIMIT 100, 100;

问题是你不知道第二个集合从哪里来。

如果您确实需要对结果集进行分页,我建议您将其存储在临时表中并从临时表中分页。

关于mysql - 合并前消除重复项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42903894/

相关文章:

mysql - 仅显示具有两种类型记录的客户并且仅显示这些记录

mysql - 多个表使用多个联结表引用一个表

mysql - Wordpress 一直在执行这个 SQL 查询?

sql - MS Access 2007 SQL 查询问题

sql-server - 在SQL中获取最近的较高和较低的行

oracle - 在 oracle 中限制联合结果

java - 将数据库中BLOB字段中的二进制内容转换为文件mySQL

mysql - 如何在 Ruby on Rails 中访问远程数据库数据?

mysql - Laravel 在其他表中查找平均结果

database - 为什么递归联合不适用于 PostgreSQL 中的复合类型