跑步时:
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添加这样的容量是可行的:
SELECT '2000-01-01 00:00:00', 223, timeslots.capacity问题是,我真正想做的是:
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_id。user_id在count()之外也抱怨user_id是“未知的”。所以我猜count()以某种方式获取了这些值。是否有类似的函数可以简单地获取capacity的值,以便我可以在having中使用它?将having子句移到where中会抱怨使用count()。
总的来说,我要完成的是一个条件插入到timeslotUsers中,它依赖于对应的timeslots行中的一个变量,并将其与与timeslots.start匹配的timeslotUsers总数进行比较。如果可能的话,我想在没有子查询的情况下这样做。
我想知道的事情:,为什么count(user_id)在HAVING中工作,而timeslots.capacity或timeslots.user_id单独不工作?它本身是否运行子查询?是否有一个函数允许我使用capacity,就像count()允许我使用user_id
编辑:
样本数据:
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)
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;问为什么是合理的吗?
发布于 2015-03-26 23:38:47
在WHERE子句上将WHERE更改为子subselect应该可以完成这一操作。这是未经检验的,但应该很接近:
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下面是一个不使用子查询的更混乱的版本
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这是滥用团体的一点点,但也应该工作。
https://stackoverflow.com/questions/29290055
复制相似问题