Mysql 对所有属性使用distinct

Mysql 对所有属性使用distinct,mysql,sql,Mysql,Sql,我们可以使用*从表中选择所有属性,我使用的是distinct,我的表包含16列,如何使用distinct。我不能从abc中选择distinct Id,* 最好的办法是什么。 另一种方法是选择distinct id、col1、col2等。使用group by而不是distinct group by col1, col2,col3 它做得很好 SELECT DISTINCT * FROM `some_table` 是绝对有效的语法 该错误是由调用Id,*引起的。当然,*也包括Id列,它通常是唯一

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

使用group by而不是distinct

group by col1, col2,col3
它做得很好

SELECT DISTINCT * FROM `some_table`
是绝对有效的语法

该错误是由调用
Id,*
引起的。当然,
*
也包括Id列,它通常是唯一的

因此,您需要的只是:

SELECT DISTINCT * FROM `abc`
你完全可以这样做。
希望这有帮助



起初,我认为它会为小组工作是最好的一个。这与从abc中选择*相同。抱歉,伙计们

如果您想输入结果,每个
id
一行,您可以使用
按id分组
。但是,不建议使用
SELECT
列表中的其他列(即使MySQL允许-这取决于您是否将
ANSI
设置为on或
Off
)。建议使用具有聚合函数的其他列,如
MIN()
MAX()
COUNT()
,等等。在MySQL中,还有一个
GROUP\u 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
的多行中的哪一行),甚至不知道是否返回-horror您可以从不同的行(具有相同的id)获得结果。正如@Andriy评论的那样,结果是除了
id
之外的列的值将被任意选择如果你想要可预测的结果,就不要使用这种技巧。


示例解决方案:如果您希望每个
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)
组合是唯一的,这将起作用。

如果其中一列的值与其他行的值不同,则distinct将不起作用。您能添加具有所需结果的示例记录吗?@ZainShah120只是为了确保,您想在MySQL和Microsoft SQL server上使用相同的SQL吗?@JoachimIsaksson No only atmysql@user1765876好的,这个问题已经用MySQL和SQL Server标记了,现在更改了。如果我是正确的,您希望每个问题都有不同的ID值吗?其他列如何?您希望选择哪一列而不是另一列的依据是什么?@itehnilogic sql如何知道要在哪一列上应用distinct?查询运行了,但结果不是真的SQL知道
DISTINCT
应用于整行,而不是单个列。@user1765876我刚刚了解您需要什么。我相信
Bhoj Raj Bhatta
echo_me
的答案就是你想要的。如果ID=6有5行,如果我按ID分组,ID=6会出现哪一行?ID=6和ID=6是什么意思?@user1765876你会从每个组得到一行完全不确定的行。只有MySQL允许使用这种类型的
GROUP BY
进行查询,而不允许进行完整的聚合。@JoachimIsaksson您的意思是我将在每个组中得到一个混合行?是的,您可能会得到混合的结果(来自同一组的不同行)。@user1765876这相当于
SELECT*from abc,其中id不为NULL,它将选择所有匹配的行,但没有任何不同的功能。不同的是冗余的。答案中的查询与abc中的select*相同,我们使用子查询,在同一个表中,平均id与不同id匹配,因此使用不同id的行shown@BhojRajBhatta你错了。DISTINCT仅适用于子选择。主查询。在ID列中没有空值的情况下,这本质上是错误的!我现在同意,这是一个不成熟的答案,感谢OrangeCrush现在我像从表group by ID中选择*,结果是什么?@user1765876:结果是除了
ID
之外的列的值将被任意选择。如果你想要可预测的结果,就不要使用这种技巧。@user1765876:对不起?具体的解决方案是什么?@user1765876:你试过这个答案的最后一个建议了吗?如果它对您不起作用,您能说明原因吗?@user1765876:已经有人问过您这个问题,我用自己的话重复这个问题:其他列(除了
id
)应该有什么值?如果表
t(id,value)
有行
(1,10)
(1,15)
,并且您只希望
1
id
值出现一次,那么
value
列在
id=1
行中应该有什么值?我建议您编辑您的问题,以增强您的示例的预期输出。在这一点上,很难比已经回答的问题更具体地回答你的问题。
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 ;