我们可以使用*来从表中选择所有属性,我使用distinct,我的表包含16列,我如何使用distinct来表示。我不能select distinct Id,* from abc;
什么是最好的方式。
另一种方法可以是选择不同的id,col1,col2等。
答案 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相同。对不起家伙