使用distinct与所有属性

时间:2013-02-03 10:37:34

标签: mysql sql

enter image description here

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

4 个答案:

答案 0 :(得分:4)

如果您希望结果中每行id一行,则可以使用GROUP BY id。但是,不建议使用SELECT列表中的其他列(即使MySQL允许它 - 这取决于您是ANSI设置On还是Off) 。建议使用具有聚合函数的其他列,如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以外的列的值将被任意选择。 如果您想要可预测的结果,请不要使用这种技术。


示例解决方案:如果您只需要每个id中的一行,并且您有一个可用于订购的日期时间或时间戳(或其他一些)列,则可以执行以下操作:

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)组合是唯一的,这将有效。

答案 1 :(得分:3)

使用group by而不是distinct

group by col1, col2,col3

它做得与众不同

答案 2 :(得分:0)

SELECT DISTINCT * FROM `some_table`

绝对有效的语法。

错误是由您致电Id, *引起的。好*也包含 Id 列,无论如何它通常都是唯一的。

所以你需要的只是:

SELECT DISTINCT * FROM `abc`

答案 3 :(得分:-2)

    SELECT * FROM abc where id in(select distinct id from abc);

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


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