LEFT OUTER JOIN没有显示所有行?

时间:2013-07-17 07:03:11

标签: mysql sql left-join outer-join

我正在尝试使用连接从一个SQL语句中获取2个表中的数据。 这个想法很简单。项目有参与者,在项目概述中,我想用参与者数量显示项目信息。

现在有2个项目,一个项目有参与者,另一个项目没有参与者。

我使用此查询:

SELECT SQL_CALC_FOUND_ROWS `p`.`id`,
       `p`.`title`, 
       `p`.`live`, 
       `p`.`startDate`,
       `p`.`endDate`, 
       COUNT(`part`.`id`) AS `participants`
FROM `projects` `p`
LEFT OUTER JOIN `participants` `part`
    ON `p`.`id`  = `part`.`projectid`
ORDER BY `p`.`live` DESC, 
         `p`.`startDate` DESC
LIMIT 0,10

问题是,此查询仅返回带有参与者的项目,而没有参与者的项目则被省略。

我在这里做错了什么?

2 个答案:

答案 0 :(得分:5)

您必须使用GROUP BY

SELECT SQL_CALC_FOUND_ROWS `p`.`id`,
       `p`.`title`, 
       `p`.`live`, 
       `p`.`startDate`,
       `p`.`endDate`, 
       COUNT(`part`.`id`) AS `participants`
FROM `projects` `p`
LEFT OUTER JOIN `participants` `part`
    ON `p`.`id`  = `part`.`projectid`
GROUP BY `p`.`id`,
         `p`.`title`, 
         `p`.`live`, 
         `p`.`startDate`,
         `p`.`endDate`
ORDER BY `p`.`live` DESC, 
         `p`.`startDate` DESC
LIMIT 0,10

这是 SQLFiddle 演示

答案 1 :(得分:3)

我不认为应该使用JOIN来完成,而是使用相关的子查询。

SELECT SQL_CALC_FOUND_ROWS `p`.`id`,
   `p`.`title`, 
   `p`.`live`, 
   `p`.`startDate`,
   `p`.`endDate`, 
   (SELECT COUNT(`part`.`id`) FROM `participants` `part` WHERE `part`.`projectid` = `p`.`id`) AS `participants`
FROM `projects` `p`
ORDER BY `p`.`live` DESC, 
     `p`.`startDate` DESC
LIMIT 0,10