SQL HAVING 从数据库丢失记录

Lost records from DB with SQL HAVING

我不知道为什么我的查询不能正常工作。 当我试图向 devices_count=0 的任何用户显示时,它没有显示。

这是我的查询:

SELECT `u`.`id` AS `usersId`, `u`.`id_user` AS `usersIdUser`, `u`.`name` AS `usersName`,
       `u`.`postal` AS `usersPostal`, `u`.`city` AS `usersCity`,
       `u`.`street` AS `usersStreet`, `g`.`name` AS `geographyName`,
       `e`.`name` AS `expertsName`, `e`.`surname` AS `expertsSurname`,
       `o`.`name` AS `ownersName`, 
       COUNT(`d`.`id`) AS `devices_count` 
FROM `users` `u`
    LEFT JOIN `devices` `d` ON `u`.`id` = `d`.`user_id` 
    LEFT JOIN `owners` `o` ON `d`.`comm_id`=`o`.`id`
    LEFT JOIN `experts` `e` ON `d`.`expert_id`=`e`.`id`
    LEFT JOIN `geography` `g` ON `u`.`voivod`=`g`.`id`
WHERE `d`.`expert_id` LIKE '%' AND `u`.`id` LIKE 3332
  AND `u`.`voivod` LIKE '%' AND `u`.`city` LIKE "%" AND `u`.`status` LIKE '%'
GROUP BY `u`.`id`
HAVING COUNT(d.id) BETWEEN 0 AND 99999
ORDER BY devices_count ASC LIMIT 0, 20

ID 为 3332 的用户在数据库中,但安装了 0 个设备 (devices_count=0)。当然,如果不通过 WHERE 条款缩小结果,它仍然不会显示所有结果。所有字段和 JOINed 列都是必需的。

您的 where 子句正在将 left join 转换为内部联接。

除了第一个 table:

,您需要将过滤逻辑移至 on 子句
FROM `users` `u`
    LEFT JOIN `devices` `d` ON `u`.`id` = `d`.`user_id` and `d`.`expert_id` LIKE '%'
    LEFT JOIN `owners` `o` ON `d`.`comm_id`=`o`.`id`
    LEFT JOIN `experts` `e` ON `d`.`expert_id`=`e`.`id`
    LEFT JOIN `geography` `g` ON `u`.`voivod`=`g`.`id`
WHERE  `u`.`id` LIKE 3332 AND
       `u`.`voivod` LIKE '%' AND `u`.`city` LIKE "%" AND `u`.`status` LIKE '%'