【问题标题】:Lost records from DB with SQL HAVING使用 SQL HAVING 从数据库中丢失记录
【发布时间】:2018-04-09 12:14:07
【问题描述】:

我不知道为什么我的查询不能正常工作。 当我尝试显示 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 列都是必需的。

【问题讨论】:

  • 请在标签中指定您使用的数据库
  • 那是无效的标准 SQL。您使用的是哪个 DBMS?
  • 您通常按您选择的列进行分组,除了那些作为设置函数的参数的列。

标签: sql count having


【解决方案1】:

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

您需要将过滤逻辑移至除第一个表之外的所有表的 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 '%'

【讨论】:

  • 你是对的@Gordon,现在它工作得非常完美 - 非常感谢!
猜你喜欢
  • 2010-12-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-30
  • 1970-01-01
相关资源
最近更新 更多