3

在此处输入图像描述

我们可以使用 * 从表中选择所有属性,我正在使用 distinct 并且我的表包含 16 列,我如何使用 distinct 与它。我不能做select distinct Id,* from abc; 最好的方法是什么。另一种方法是选择不同的 id、col1、col2 等。

4

4 回答 4

4

如果你想在结果中,每行id,你可以使用GROUP BY id. 但是,不建议使用列表中的其他列SELECT(即使 MySQL 允许 - 这取决于您是否有ANSI设置OnOff)。建议将其他列与聚合函数(如MIN()MAX()COUNT()等)一起使用。在 MySQL 中,还有一个GROUP_CONCAT()聚合函数可以从组的列中收集所有值:

SELECT
    id
  , COUNT(*)   AS number_of_rows_with_same_id
  , MIN(col1)  AS min_col1
  , MAX(col1)  AS max_col1
  --
  , GROUP_CONCAT(col1)  AS gc_col1
  , GROUP_CONCAT(col2)  AS gc_col2
  --
  , GROUP_CONCAT(col16) AS gc_col16
FROM
    abc
GROUP BY
    id ;

查询:

SELECT *
FROM abc
GROUP BY id ;

不是有效的 SQL(最多 92 个),因为您在列表中有非聚合结果SELECT并且在 SQL (2003+) 中有效。尽管如此,这里还是无效的,因为其他列在功能上不依赖于分组列 ( id)。MySQL 不幸地允许这样的查询并且不检查函数依赖。

因此,您永远不知道将返回哪一行(在许多相同的行中id),或者即使 - 恐怖!- 您从不同的行(具有相同的 id)获得结果。正如@Andriy 评论的那样,结果是列的值不是id将被任意选择。如果您想要可预测的结果,请不要使用这种技术。


一个示例解决方案:如果您只需要 each 中的一行id,并且您有一个可用于排序的 datetime 或 timestamp(或其他一些)列,您可以这样做:

SELECT t.*
FROM abc AS t
  JOIN
    ( SELECT id
           , MIN(some_column) AS m            -- or MAX()
      FROM abc
      GROUP BY id
    ) AS g
    ON  g.id = t.id
    AND g.m = t.some_column ;

只要(id, some_column)组合是唯一的,这将起作用。

于 2013-02-03T11:10:37.470 回答
3

使用 group by 而不是 distinct

group by col1, col2,col3

它的表现与众不同

于 2013-02-03T10:38:55.850 回答
0
SELECT DISTINCT * FROM `some_table`

是绝对有效的语法。

该错误是由于您调用Id, *. Well也*包括Id列,这通常是唯一的。

所以你需要的只是:

SELECT DISTINCT * FROM `abc`
于 2013-02-03T10:44:55.267 回答
-2
    SELECT * FROM abc where id in(select distinct id from abc);

你完全可以做到这一点。
希望这可以帮助


最初我认为它适用于 group by 是最好的。这与执行 select * froom abc 相同。对不起大家

于 2013-02-03T10:51:46.993 回答