我们可以使用 * 从表中选择所有属性,我正在使用 distinct 并且我的表包含 16 列,我如何使用 distinct 与它。我不能做select distinct Id,* from abc;
最好的方法是什么。另一种方法是选择不同的 id、col1、col2 等。
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
将被任意选择。如果您想要可预测的结果,请不要使用这种技术。
一个示例解决方案:如果您只需要 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)
组合是唯一的,这将起作用。
使用 group by 而不是 distinct
group by col1, col2,col3
它的表现与众不同
SELECT DISTINCT * FROM `some_table`
是绝对有效的语法。
该错误是由于您调用Id, *
. Well也*
包括Id列,这通常是唯一的。
所以你需要的只是:
SELECT DISTINCT * FROM `abc`
SELECT * FROM abc where id in(select distinct id from abc);
你完全可以做到这一点。
希望这可以帮助
最初我认为它适用于 group by 是最好的。这与执行 select * froom abc 相同。对不起大家