Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql SQL表连接另一个表_Mysql_Sql - Fatal编程技术网

Mysql SQL表连接另一个表

Mysql SQL表连接另一个表,mysql,sql,Mysql,Sql,我有两个表(主表和分类表) 主表记录: categoryCode field2 field3 1 XXXXXX1 ACTIVE 3 XXXXXX2 ACTIVE 1 XXXXXX3 ACTIVE 1 XXXXXX4 ACTIVE 3 XXXXXX5 ACTIVE 3 XXXXXX5 NOT ACTIVE categoryCode

我有两个表(主表和分类表)

主表记录:

categoryCode  field2   field3

1             XXXXXX1  ACTIVE
3             XXXXXX2  ACTIVE
1             XXXXXX3  ACTIVE
1             XXXXXX4  ACTIVE
3             XXXXXX5  ACTIVE
3             XXXXXX5  NOT ACTIVE
categoryCode        categoryname

1                   categoryname1
2                   categoryname2
3                   categoryname3
分类记录:

categoryCode  field2   field3

1             XXXXXX1  ACTIVE
3             XXXXXX2  ACTIVE
1             XXXXXX3  ACTIVE
1             XXXXXX4  ACTIVE
3             XXXXXX5  ACTIVE
3             XXXXXX5  NOT ACTIVE
categoryCode        categoryname

1                   categoryname1
2                   categoryname2
3                   categoryname3
到目前为止,我有这个疑问

  SELECT COUNT(*) AS recordcount,
         categoryCode AS catCode,
         categorytable.categoryname
    FROM maintable, 
         categorytable
   WHERE categorytable.categoryCode = maintable.categoryCode 
     AND maintable.field3 = 'ACTIVE'
GROUP BY maintable.categoryCode 
ORDER BY categorytable.categoryCode
具有以下输出

recordcount catCode categoryname
----------------------------------
3           1       categoryname1
2           3       categoryname3
但我需要这样的输出(包含0条记录的类别显示记录计数为0):


您需要使用左联接:

SELECT COUNT(*) AS recordcount, categoryCode AS catCode, categorytable.categoryname
FROM categorytable
LEFT JOIN maintable ON categorytable.categoryCode = maintable.categoryCode 
GROUP BY maintable.categoryCode 
ORDER BY categorytable.categoryCode
如果不想颠倒表名,请参阅AlexanderMP的答案

SELECT 
    coalesce(COUNT(maintable.categoryCode),0) AS recordcount, 
    categorytable.categoryCode AS catCode, 
    categorytable.categoryname
FROM 
    maintable 
RIGHT JOIN categorytable ON categorytable.categoryCode = maintable.categoryCode 
GROUP BY 
    categorytable.categoryCode, 
    categorytable.categoryname 
ORDER BY 
    categorytable.categoryCode
或者,使用左连接

SELECT 
    coalesce(COUNT(maintable.categoryCode),0) AS recordcount, 
    categorytable.categoryCode AS catCode, 
    categorytable.categoryname
FROM 
    categorytable
LEFT JOIN maintable ON categorytable.categoryCode = maintable.categoryCode 
GROUP BY 
    categorytable.categoryCode, 
    categorytable.categoryname 
ORDER BY 
    categorytable.categoryCode

我打赌你的意思是写“右连接”。@AlexanderMP-无论哪种方式,结果都是一样的。你的查询显示了相同的输出(没有显示记录计数为0的类别)。我真的不知道MySQL是否正确,但在我使用过的所有其他RDBMS(FirebirdSql、MSSQL、PostgreSql)中,这都要求右连接,由于LEFT join只返回
maintable
中存在的行,即使它们不在
categorytable
中,这里需要另一种方式-存在于
categorytable
中的行不一定存在于
maintable
中,因此有4种类型的联接:内部联接(仅获取两个表中存在的记录)、左外部联接(即使在联接表中不存在,也从第一个表中获取记录)、右外部联接(即使在第一个表中不存在,也从联接表中获取记录)和完全外部联接(从所有表中获取所有行)。该死的Ctrl+V!它不能读取吗?它必须粘贴“左”第二次?愚蠢的键盘。它什么时候能学会?