首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MySQL插入..。选择。在HAVING子句中使用计数(列)但不使用列。

MySQL插入..。选择。在HAVING子句中使用计数(列)但不使用列。
EN

Stack Overflow用户
提问于 2015-03-26 22:29:09
回答 1查看 657关注 0票数 1

跑步时:

代码语言:javascript
复制
SELECT '2000-01-01 00:00:00', 223
FROM timeslots
LEFT JOIN timeslotUsers ON timeslots.start = timeslotUsers.start
WHERE timeslots.start = '2000-01-01 00:00:00'
HAVING count(user_id) < timeslots.capacity

我要去找ERROR 1054 (42S22): Unknown column 'timeslots.capacity' in 'having clause'

我了解到HAVING对查询后的值起作用,因此,向SELECT添加这样的容量是可行的:

代码语言:javascript
复制
SELECT '2000-01-01 00:00:00', 223, timeslots.capacity

问题是,我真正想做的是:

代码语言:javascript
复制
INSERT INTO timslotUsers (start, user_id)
SELECT '2000-01-01 00:00:00', 223
FROM timeslots
LEFT JOIN timeslotUsers ON timeslots.start = timeslotUsers.start
WHERE timeslots.start = '2000-01-01 00:00:00'
HAVING count(user_id) < timeslots.capacity

因此,据我所知,select参数必须与insert参数相匹配,因此不能添加capacity。我不知道为什么count(user_id)having中工作,而select参数中没有user_iduser_idcount()之外也抱怨user_id是“未知的”。所以我猜count()以某种方式获取了这些值。是否有类似的函数可以简单地获取capacity的值,以便我可以在having中使用它?将having子句移到where中会抱怨使用count()

总的来说,我要完成的是一个条件插入到timeslotUsers中,它依赖于对应的timeslots行中的一个变量,并将其与与timeslots.start匹配的timeslotUsers总数进行比较。如果可能的话,我想在没有子查询的情况下这样做。

我想知道的事情:,为什么count(user_id)HAVING中工作,而timeslots.capacitytimeslots.user_id单独不工作?它本身是否运行子查询?是否有一个函数允许我使用capacity,就像count()允许我使用user_id

编辑:

样本数据:

代码语言:javascript
复制
SELECT * FROM timeslotUsers;
+---------------------+---------+
| start               | user_id |
+---------------------+---------+
| 2000-01-01 00:00:00 |     227 |
| 2000-01-01 00:00:00 |     228 |
| 2000-01-01 00:00:00 |     229 |
| 2000-01-01 00:00:00 |    2234 |
+---------------------+---------+
SELECT * FROM timeslots;
+---------------------+---------------------+-----------+----------+
| start               | end                 | location  | capacity |
+---------------------+---------------------+-----------+----------+
| 2000-01-01 00:00:00 | 2000-01-01 02:00:00 | someplace |        5 |
+---------------------+---------------------+-----------+----------+

当我运行上面的插入时,我希望将另一行放在timeslotUsers中,但前提是timeslotUsers中有比capacity行更少的与start匹配的行。

Edit2:

哇。这个很管用。(改为FROM timeslots并添加了GROUP BY capacity)

代码语言:javascript
复制
INSERT INTO timeslotUsers (start, user_id)
SELECT timeslots.start, 223
FROM timeslots
LEFT JOIN timeslotUsers ON timeslots.start = timeslotUsers.start
WHERE timeslots.start = '2000-01-01 00:00:00'
GROUP BY capacity
HAVING COUNT(user_id) < capacity;

问为什么是合理的吗?

EN

回答 1

Stack Overflow用户

发布于 2015-03-26 23:38:47

在WHERE子句上将WHERE更改为子subselect应该可以完成这一操作。这是未经检验的,但应该很接近:

代码语言:javascript
复制
INSERT INTO timeslotUsers (start, user_id) SELECT '2000-01-01 00:00:00', 223
FROM timeslots LEFT JOIN timeslotUsers ON timeslots.start = timeslotUsers.start 
WHERE timeslots.start = '2000-01-01 00:00:00' AND (SELECT COUNT(*) from 
timeslotUsers t where t.start = '2000-01-01 00:00:00') < timeslots.capacity

下面是一个不使用子查询的更混乱的版本

代码语言:javascript
复制
INSERT INTO timeslotUsers (start, user_id) SELECT '2000-01-01 00:00:00', 223
FROM timeslots LEFT JOIN timeslotUsers on timeslots.start = timeslotUsers.start 
WHERE timeslots.start = '2000-01-01 00:00:00' GROUP BY timeslots.start, 
timeslots.capacity HAVING SUM(CASE WHEN timeslotUsers.start IS NULL THEN 0 ELSE 
1 END) < timeslots.capacity

这是滥用团体的一点点,但也应该工作。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29290055

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档