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!它不能读取吗?它必须粘贴“左”第二次?愚蠢的键盘。它什么时候能学会?