0

我准备了一个带有多表连接的查询。我用这个查询得到了一个完美的结果:

SELECT
`request`.`ID` ,  `request`.`USER_ID` ,  `donor`.`FULL_NAME` ,
`request`.`BLOOD_GROUP`, `request`.`UNITS` ,  `city`.`NAME` AS  `LOCATION`,
`city`.`ID` AS  `LOCATION_ID` ,  `request`.`DATE` ,  `request`.`EXPIRES_ON` ,
`request`.`ADDRESS` ,  `request`.`STATUS`
FROM  `request` 
JOIN  `donor` ON  `donor`.`ID` =  `request`.`USER_ID` 
JOIN  `city` ON  `city`.`ID` =  `request`.`LOCATION` 
ORDER BY  `request`.`DATE` 

在这里,我得到了我期待的所有行......

但是,第二个查询增加了 count( response.ID) 列,生成了一个计数为 1 的单行,因为表中只有一行response

这是修改后的查询:

SELECT 
`request`.`ID` ,  `request`.`USER_ID` ,  `donor`.`FULL_NAME` ,
`request`.`BLOOD_GROUP` ,  `request`.`UNITS` ,  `city`.`NAME` AS  `LOCATION` ,
`city`.`ID` AS  `LOCATION_ID` ,  `request`.`DATE` ,  `request`.`EXPIRES_ON` ,
`request`.`ADDRESS` ,  `request`.`STATUS`, count(`response`.`ID`) AS `RESPONSE`
FROM  `request` 
JOIN  `donor` ON  `donor`.`ID` =  `request`.`USER_ID` 
JOIN  `city` ON  `city`.`ID` =  `request`.`LOCATION`
JOIN `response` ON `response`.`REQUEST_ID` = `request`.`ID`
ORDER BY  `request`.`DATE` 

我在这里期望的是查询返回表中的所有行,并从它是 0 还是任何整数request返回计数。response

我尝试使用其他问题中使用的策略,但没有奏效。如果他们对此有任何解决方案,请建议我。如果什么都没有,那么我只有一个选择,那就是为了计数而进行另一个查询。

4

2 回答 2

0

使用左连接而不是内连接。

SELECT 
    `request`.`ID` ,  `request`.`USER_ID` ,  `donor`.`FULL_NAME` ,
    `request`.`BLOOD_GROUP` ,  `request`.`UNITS` ,  `city`.`NAME` AS  `LOCATION` ,
    `city`.`ID` AS  `LOCATION_ID` ,  `request`.`DATE` ,  `request`.`EXPIRES_ON` ,
    `request`.`ADDRESS` ,  `request`.`STATUS`, count(`response`.`ID`) AS `RESPONSE`
FROM  `request` 
    JOIN  `donor` ON  `donor`.`ID` =  `request`.`USER_ID` 
    JOIN  `city` ON  `city`.`ID` =  `request`.`LOCATION`
    LEFT JOIN `response` ON `response`.`REQUEST_ID` = `request`.`ID`
ORDER BY  `request`.`DATE` 
于 2013-11-08T10:17:03.740 回答
0

一位同事帮助我找到了更好且资源友好的解决方案。

我查询的计数行是统计的,完全取决于插入到表中或从response表中删除的任何行。因此,与其运行复杂的查询,他建议RESPONSE在表中添加列request并在插入或删除时更新值。

response所以,我改变了我的程序,并在表上的 INSERT 和 DELETE 查询之后编写了一个 UPDATE 查询。

有时,简单的解决方案比复杂的方法要好得多。

谢谢。

于 2013-11-08T11:00:40.263 回答