为什么sql是正确的,运行它的内部机制是正确的?

nimxete2  于 2021-06-20  发布在  Mysql
关注(0)|答案(5)|浏览(287)

下面的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 是吗?

mum43rcc

mum43rcc1#

{select id,count()from mytable group by id having count()>1}
使用此代码,您可以看到重复多个行的行,并且可以自己更改此查询

72qzrwbm

72qzrwbm2#

count(*) in subquery  == select count(*) from t

这是错误的。因为在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 )
jrcvhitl

jrcvhitl3#

使用group by并拥有:

SELECT id, count(1) as Total FROM MyTable AS t1
GROUP BY t1.id
HAVING Total = 2
dgenwo3n

dgenwo3n4#

SELECT * FROM t1 AS t
  WHERE 2 = (SELECT COUNT(*) FROM t1 WHERE t1.id = t.id);

这个查询遍历t1中的每条记录,然后在子查询中再次查看t1,看看在这种情况下 id 被发现2次(而且只有2次)。您可以对t1中的任何其他列(或任何表)执行相同的操作。
如果要查看表中多次出现的所有值,请更改 WHERE 2 =WHERE 1 < . 这也将给出表中3倍、4倍等的值。

o3imoua4

o3imoua45#

查询包含中的相关子查询 WHERE 条款:

SELECT COUNT(*) FROM t1 WHERE t1.id = t.id

之所以称为correlated,是因为它通过与主查询相关 t.id . 因此,这个子查询统计具有 id 等于当前值的值 id 主查询返回的记录的值。
因此, predicate

(SELECT COUNT(*) FROM t1 WHERE t1.id = t.id) = 2

计算结果为 true 对于任何有 id 表中出现两次的值。

相关问题