计算具有连接匹配的行

时间:2014-04-08 21:29:41

标签: mysql sql join

在MySQL数据库中,我有两个表。我需要计算tbl1tbl2中有多少行匹配tbl1 code (pk) label tbl2 id code1 (fk to tbl1.code if there is a match for a given row) reltype 。以下是简化的相关表结构:

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

我有以下sql开头:

tbl2

我认为这告诉我tbl1中有多少行在tbl1中匹配。它是否正确?另外,我发布的原因是,如何更改此内容以确定tbl2中{{1}}中有多少行匹配?

5 个答案:

答案 0 :(得分:3)

select count(*) from tbl1 
where code in (select code1 from tbl2) 

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

答案 1 :(得分:1)

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

答案 2 :(得分:1)

SELECT
  COUNT(t1.code) Cnt
FROM tbl1 T1
  JOIN tbl1 T2
     ON T1.code = T2.code1
WHERE T2.reltype='desiredtype'
GROUP BY T1.code

答案 3 :(得分:1)

您的查询是正确的。内连接提供tbl1和tbl2中是否存在唯一匹配。

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

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

答案 4 :(得分:1)

有几种方法。

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

如果您只想要一个计数,那么您可以修改您的查询以执行SELECT COUNT(DISTINCT tbl1.pk)DISTINCT聚合中的COUNT()修饰符仅计算唯一值,即表达式的任何重复值都不会包含在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