2011-03-08 62 views
1

我有兩個表非隱式連接,返回時正確的連接是空

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表與contactIdgroupId英寸

這一切工作正常。

我想做一個查詢,獲取cg表中所有組的所有信息,其中account = 1

作爲此查詢的一部分,我還希望添加一個稱爲數字的額外行,該數字包含該組的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 

其中一期工程完美只要至少一個接觸存在一組。 否則該組不返回。

必須對此查詢做些什麼才能使其返回所有組?

回答

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子句)。

+0

@Hailwood沒有這樣的匹配記錄:如果你想0而不是1,你需要'COUNT(CGL .groupId)'而不是'COUNT(*)'。原因是'COUNT(*)'計算結果集中的行數。 'COUNT(x)'只計算其中x不爲NULL的那些行。查看完整查詢的更新。 – 2011-03-08 20:08:55

+0

opps,我的不好; D歡呼 – Hailwood 2011-03-08 20:10:41

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 
+1

知道一旦我修改IFNULL行爲'IFNULL(COUNT(cgl.groupId),0)AS號碼' – Hailwood 2011-03-08 20:09:44