下面的sql来自mysql文档。它是:
SELECT * FROM t1 AS t WHERE 2 = (SELECT COUNT(*) FROM t1 WHERE t1.id = t.id);
文档说它在表t1中找到了所有行,其中包含一个在给定列中出现两次的值,并且没有解释sql。t1和t是同一张表,所以 count(*) in subquery == select count(*) from t 是吗?
count(*) in subquery == select count(*) from t
uqcuzwp81#
这个查询遍历t1中的每条记录,然后在子查询中再次查看t1,看看在这种情况下 id 被发现2次(而且只有2次)。您可以对t1中的任何其他列(或任何表)执行相同的操作。如果要查看表中多次出现的所有值,请更改 WHERE 2 = 由 WHERE 1 < . 这也将给出表中3倍、4倍等的值。
id
WHERE 2 =
WHERE 1 <
eagi6jfj2#
{select id,count()from mytable group by id having count()>1}使用此代码,您可以看到重复多个行的行,并且可以自己更改此查询
emeijp433#
这是错误的。因为在mysql中你不能这样使用它。所以您必须这样运行它才能得到具有两行的相同id的结果。如果你想得到相同事件的计数,
SELECT id, name, count(*) AS all_count FROM t1 GROUP BY id HAVING all_count > 1 ORDER BY all_count DESC
你也可以像这样得到你的查询值,
select * from t1 where id in ( select id from t1 group by id having count(*) > 1 )
kmpatx3s4#
使用group by并拥有:
SELECT id, count(1) as Total FROM MyTable AS t1 GROUP BY t1.id HAVING Total = 2
wi3ka0sx5#
查询包含中的相关子查询 WHERE 条款:
WHERE
SELECT COUNT(*) FROM t1 WHERE t1.id = t.id
之所以称为correlated,是因为它通过与主查询相关 t.id . 因此,这个子查询统计具有 id 等于当前值的值 id 主查询返回的记录的值。因此, predicate
t.id
(SELECT COUNT(*) FROM t1 WHERE t1.id = t.id) = 2
计算结果为 true 对于任何有 id 表中出现两次的值。
true
5条答案
按热度按时间uqcuzwp81#
这个查询遍历t1中的每条记录,然后在子查询中再次查看t1,看看在这种情况下
id
被发现2次(而且只有2次)。您可以对t1中的任何其他列(或任何表)执行相同的操作。如果要查看表中多次出现的所有值,请更改
WHERE 2 =
由WHERE 1 <
. 这也将给出表中3倍、4倍等的值。eagi6jfj2#
{select id,count()from mytable group by id having count()>1}
使用此代码,您可以看到重复多个行的行,并且可以自己更改此查询
emeijp433#
这是错误的。因为在mysql中你不能这样使用它。所以您必须这样运行它才能得到具有两行的相同id的结果。
如果你想得到相同事件的计数,
你也可以像这样得到你的查询值,
kmpatx3s4#
使用group by并拥有:
wi3ka0sx5#
查询包含中的相关子查询
WHERE
条款:之所以称为correlated,是因为它通过与主查询相关
t.id
. 因此,这个子查询统计具有id
等于当前值的值id
主查询返回的记录的值。因此, predicate
计算结果为
true
对于任何有id
表中出现两次的值。