我有两张桌子:
contactGroups cg
和contactGroupLink cgl
。
CREATE TABLE `contactgroups` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`account` int(11) DEFAULT NULL,
`name` varchar(50) DEFAULT NULL,
`description` text,
`dateCreated` datetime DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=2 DEFAULT CHARSET=latin1
CREATE TABLE `contactgrouplink` (
`groupId` int(11) NOT NULL,
`ContactId` int(11) NOT NULL,
PRIMARY KEY (`groupId`,`ContactId`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1
如果某个联系人在一个群组中,那么一个条目会被cgl
和contactId
放入groupId
表。
一切正常。
我想要执行一个查询,从cg
表account = 1
获取所有组的所有信息。
作为此查询的一部分,我还想添加一个名为number的额外行,如果该组的cgl
表中有条目,则该行具有该数字。
我正在使用
SELECT
cg.id AS id,
NAME,
description,
dateCreated,
COUNT(*) AS number
FROM
contactgroups cg,
contactgrouplink cgl
WHERE
cg.account = 1
AND
cg.id = cgl.groupId
GROUP BY
cg.id
只要至少有一个联系人,就完美。 否则该组不会被退回。
我必须对此查询做些什么才能让它返回所有组?
答案 0 :(得分:1)
使用LEFT JOIN为左表的每个成员返回一行,即使右表中没有相应的行。
换句话说,请使用此查询:
SELECT
cg.id AS id,
NAME,
description,
dateCreated,
COUNT(cgl.groupId) AS number
FROM contactgroups AS cg
LEFT JOIN contactgrouplink AS cgl
ON cg.id = cgl.groupId
WHERE cg.account = 1
当然这只会返回cg.account = 1
所有的组,但我认为这就是你所说的“所有组”。 (如果你真的想要所有组,那么省略WHERE子句。)
答案 1 :(得分:1)
使用LEFT JOIN,并且IFNULL()将在cgl别名表中没有此类匹配记录的条件下阻止空值
SELECT
cg.id AS id,
NAME,
description,
dateCreated,
IFNULL( COUNT(*), 0 ) AS number
FROM
contactgroups cg
LEFT JOIN contactgrouplink cgl
ON cg.id = cgl.groupID
WHERE
cg.account = 1