【问题标题】:How to do equivalent of "limit distinct"?如何做相当于“限制不同”?
【发布时间】:2008-12-30 16:17:53
【问题描述】:

如何将结果集限制为给定列的 n 个不同值,其中实际行数可能更高?

输入表:

client_id, employer_id, other_value
1, 2, abc
1, 3, defg
2, 3, dkfjh
3, 1, ldkfjkj
4, 4, dlkfjk
4, 5, 342
4, 6, dkj
5, 1, dlkfj
6, 1, 34kjf
7, 7, 34kjf
8, 6, lkjkj
8, 7, 23kj

期望的输出,其中 limit distinct=5 个不同的 client_id 值:

1, 2, abc
1, 3, defg
2, 3, dkfjh
3, 1, ldkfjkj
4, 4, dlkfjk
4, 5, 342
4, 6, dkj
5, 1, dlkfj

此平台适用于 MySQL。

【问题讨论】:

    标签: sql mysql


    【解决方案1】:

    您可以使用子选择

    select * from table where client_id in 
    (select distinct client_id from table order by client_id limit 5)
    

    【讨论】:

    • 我认为这是对的,但我会暂时搁置这个问题,看看是否有其他人有更好的答案
    • 你能在 MySQL 中做SELECT IN 查询吗?
    【解决方案2】:

    这适用于 SQL Server。我不记得了,MySQL 可能使用 LIMIT 关键字而不是 TOP。如果您可以通过在同一子查询中使用 LIMIT 和 DISTINCT 来摆脱最内部的子查询,这可能会使查询更有效。 (看起来 Vinko 使用了这种方法,并且 LIMIT 是正确的。不过,我将把它留在这里,以获得第二个可能的答案。)

    SELECT
         client_id,
         employer_id,
         other_value
    FROM
         MyTable
    WHERE
         client_id IN
         (
              SELECT TOP 5
                   client_id
              FROM
              (
                   SELECT DISTINCT
                        client_id
                   FROM
                        MyTable
              ) SQ
              ORDER BY
                   client_id
         )
    

    当然,在子查询中加入自己的 WHERE 子句和 ORDER BY 子句。

    另一种可能性(比较性能,看看哪个效果更好)是:

    SELECT
         client_id,
         employer_id,
         other_value
    FROM
         MyTable T1
    WHERE
         T1.code IN
         (
              SELECT
                   T2.code
              FROM
                   MyTable T2
              WHERE
                   (SELECT COUNT(*) FROM MyTable T3 WHERE T3,code < T2.code) < 5
         )
    

    【讨论】:

      【解决方案3】:

      -- 在 Microsoft SQL Server 中使用公用表表达式。 -- MS SQL 中不存在 LIMIT 函数。

      WITH CTE
      AS
      (SELECT DISTINCT([COLUMN_NAME])
      FROM [TABLE_NAME])
      SELECT TOP (5) [[COLUMN_NAME]]
      FROM CTE;
      

      【讨论】:

        【解决方案4】:

        如果有人在该平台上,这适用于 ‍‍MS SQL

        SET ROWCOUNT 10;
        SELECT DISTINCT
             column1, column2, column3,...
        FROM 
             Table1
        WHERE ...
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2013-02-10
          • 1970-01-01
          • 1970-01-01
          • 2016-01-06
          • 1970-01-01
          • 1970-01-01
          • 2021-07-13
          • 1970-01-01
          相关资源
          最近更新 更多