Mysql 正在计算具有联接匹配项的行

Mysql 正在计算具有联接匹配项的行,mysql,sql,join,Mysql,Sql,Join,在MySQL数据库中,我有两个表。我需要计算tbl1中有多少行在tbl2中匹配。以下是简化的相关表格结构: tbl1 code (pk) label tbl2 id code1 (fk to tbl1.code if there is a match for a given row) reltype 我从以下sql开始: SELECT code, label FROM tbl1 INNER JOIN tbl2 ON tbl1.c

在MySQL数据库中,我有两个表。我需要计算
tbl1
中有多少行在
tbl2
中匹配。以下是简化的相关表格结构:

tbl1  
    code (pk)
    label  

tbl2  
    id  
    code1 (fk to tbl1.code if there is a match for a given row)  
    reltype  
我从以下sql开始:

SELECT code, label FROM tbl1 INNER JOIN tbl2 ON tbl1.code=tbl2.code1  
WHERE reltype='desiredtype';  
我想这会告诉我
tbl2
中有多少行与tbl1匹配。这是正确的吗?另外,我发帖的原因是,我如何更改它以确定
tbl1
中有多少行与
tbl2
中的行匹配?

SELECT 
    COUNT(tbl1.code) 
FROM 
    tbl1 INNER JOIN tbl2 ON tbl1.code=tbl2.code1  
WHERE 
    tbl2.reltype='desiredtype'
GROUP BY 
    tbl1.code

也许吧?可能需要
distinct(code1)
进行优化。

您的查询是正确的。如果tbl1和tbl2中都有唯一的匹配项,则内部联接提供

SELECT tb1.code, tb1.label FROM tbl1 INNER JOIN tbl2 ON tbl1.code=tbl2.code1  
WHERE reltype='desiredtype';  

可以在不同的情况下使用左连接或右连接

有两种方法

假设您在tbl1中有一个主键,您可以执行类似于您的查询,但添加一个
GROUP BY tbl1.pk
,以消除重复项,并将该查询作为内联视图引用,以获取该查询返回的行数。(这不是最有效的方法。)

如果您只需要一个计数,那么您可以修改查询以执行
选择计数(DISTINCT tbl1.pk)
COUNT()
聚合中的
DISTINCT
修饰符只计算唯一值,也就是说,表达式的任何重复值都不会包含在
COUNT()
中。这可能是最有效的方法:

SELECT COUNT(DISTINCT tbl1.code)
  FROM tbl1
  JOIN tbl2 
    ON tbl2.code1 = tbl1.code  
   AND tbl2.reltype='desiredtype'; 

还有其他几种选择。一种方法是加入一个内联视图,该视图从tbl2获得一个不同的列表,例如

SELECT COUNT(1)
  FROM tbl1 
  JOIN (SELECT tbl2.code1
          FROM tbl2
         WHERE tbl2.reltype = 'desiredtype'
         GROUP BY tbl2.code1
       ) d
    ON d.code1 = tbl1.code

tbl2可以有多个匹配项吗?感谢您作为第一响应者。我运行了您的查询,它给出了tbl1中行数的8倍。我想要一个在tbl1中的行总数的0%到100%之间的数字。我如何修改你的代码来实现这一点?很高兴能帮助你。我已更改查询,请检查+1,谢谢。修改后的代码打印出所有匹配的行,而不是计数。但行数与crisky代码生成的计数数相同。您的代码运行需要3.5分钟,而他的版本在不到2秒内给出相同的数字。这不会返回
tbl1
中在
tbl2
@spencer7593中具有匹配行的行数。您可以使用count()方法以获得其他答案中的行数+1。这应返回指定的结果(除了reltype列上的条件)。(子查询)中的
在MySQL中可能是一个真正的性能瓶颈,因为MySQL处理外部查询返回的每一行的子查询的方式。还有更有效的方法。(不清楚是否应包括
reltype
上的OP标准。)@Chrisky+1,谢谢。这在一个非常大的数据文件上运行不到2秒钟。
SELECT COUNT(DISTINCT tbl1.code)
  FROM tbl1
  JOIN tbl2 
    ON tbl2.code1 = tbl1.code  
   AND tbl2.reltype='desiredtype'; 
SELECT COUNT(1)
  FROM tbl1 
  JOIN (SELECT tbl2.code1
          FROM tbl2
         WHERE tbl2.reltype = 'desiredtype'
         GROUP BY tbl2.code1
       ) d
    ON d.code1 = tbl1.code