MySQL 查询仅选择一个条目

标签 mysql database select count having-clause

我有两个表,h_user 和 appointment,我想在这个查询中获取在过去三个月中错过超过 3 个约会的所有用户。我是这样做的:

select h_user.name from h_user
  inner join appointment on appointment.id_user=h_user.id
  having count(appointment.missed='y' and date(appointment.datetime)>(curdate()-interval 3 month))>3;

我的问题是,当我运行它时,我只得到了一个用户,而我应该得到两个用户,因为我包含了这些(第三个值在这里不相关,它是医生的 ID):

insert into appointment values('2019-10-11 16:00:00','1','10','y');
insert into appointment values('2019-11-15 10:00:00','1','11','y');
insert into appointment values('2019-12-14 10:00:00','1','11','y');
insert into appointment values('2019-11-21 10:00:00','1','11','y');
insert into appointment values('2019-10-21 10:00:00','1','11','y');
insert into appointment values('2019-10-11 16:00:00','2','12','y');
insert into appointment values('2019-11-15 10:00:00','2','13','y');
insert into appointment values('2019-12-14 10:00:00','2','13','y');
insert into appointment values('2019-11-21 10:00:00','2','13','y');
insert into appointment values('2019-10-21 10:00:00','2','13','y');

此外,当我删除用户时,结果会给我并再次运行它,它会给我另一个,所以我知道它只对一个用户有效。如果有人能帮我解决这个问题那就太好了,请提前联系!

最佳答案

基本上您的查询缺少 group by 子句(旧版本的 MySQL 允许),所以它给您错误的结果。只需添加缺少的子句(您确实希望在 group by 中包含 users 表的主键列,以防两个不同的用户具有相同的 name)。

您应该将所有条件 移至where 子句以提高效率。我还建议不要对表列使用 date(),因为这会破坏现有索引;没有这个功能你可以得到相同的结果。

考虑:

select u.name 
from h_user u
inner join appointment a  on a.id_user = u.id
where a.datetime > curdate() - interval 3 month and a.missed = 'y'
group by u.id, u.name 
having count(*) > 3;

Demo on DB Fiddle :

| name |
| :--- |
| foo  |
| bar  |

关于MySQL 查询仅选择一个条目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59592509/

相关文章:

php - 如何将 'And' 子句放入多对多

mysql - Spring MVC-在jsp中显示对象值

database - 创建 postgres 数据库的 docker 镜像?

mysql - 查找数据库中是否存在列(/表)

database - 网站开始抛出错误 : System resource exceeded.( Access 数据库)

php - 忽略 MySQL JOIN 查询中的空结果

mysql - 当多边形的点为经纬度时,如何在MySQL数据库中计算多边形的面积?

javascript - jQuery 查找 id 然后执行操作

mysql - 在 SQL 中,如何从 SELECT * FROM ... 中排除结果?

html - 选择选中和其他选项显示不同?