我正在尝试使用连接从一个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
问题是,此查询仅返回带有参与者的项目,而没有参与者的项目则被省略。
我在这里做错了什么?
答案 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