我看过多个帖子,但似乎无法找到我问题的理想答案。我正在创建一个带有调度程序的系统,我需要多个链才能使查询返回答案。所以这是场景。用户需要注册并在注册时向用户显示日期。
例如,我有1月1日,1月2日和1月3日,当前日期是1月2日。显然,1月1日应该过期。这不会包含在列表中,因此我将可用性设置为0(是的,手动)。只有1月2日和1月3日。我还需要找到1月2日是否容纳了30人。否则,我需要把他带到1月3日。我得到了一些我不知道如何链接的代码部分。
预期产出: query1(1月2日和1月3日应该是结果)
SELECT * FROM rooms WHERE availability = 0
RoomID Room Date Room Availability
1 Jan 1 1
2 Jan 2 0
3 Jan 3 0
query2 - (计算在特定房间分配的人员)
SELECT COUNT(RoomAssigned) FROM users
Users RoomAssigned
Jack 2
Eddie 2
query3 - (系统应该能够找到第一个可用的房间) if(query2 results< 30) 将新用户放入查询1中的结果房间
如果我所寻找的链条可能不合适,我愿意接受不同的建议。谢谢。 :)
答案 0 :(得分:0)
您的问题似乎对您拥有的表格及其中包含的内容非常困惑,而且我看不到您的示例查询如何生成您显示的输出。但看起来这个查询会做你想做的事情:
SELECT *
FROM rooms
WHERE availability = 1
AND roomID NOT IN (
SELECT roomAssigned
FROM users
WHERE availability = 1
GROUP BY roomAssigned
HAVING COUNT(*) >= 30)
ORDER BY roomDate
LIMIT 1
子查询找到所有已填充的房间,然后我们从主查询中排除这些房间。然后我们按日期对剩余房间进行排序,并选择第一个LIMIT 1
。
答案 1 :(得分:0)
我想你会想要这样的东西:
SELECT r.[RoomID],
r.[Room Date]
FROM rooms r
LEFT JOIN users u
ON r.[RoomID] = u.[RoomAssigned]
WHERE r.[Room Date] >= CURDATE()
GROUP BY r.[RoomId], r.[Room Date]
ORDER BY r.[Room Date], r.[Room Id]
HAVING COUNT(u.[RoomAssigned]) < 30
LIMIT 1
我没有测试过,所以可能需要进行一些调整。这就像@Barmar的答案,只使用连接而不是嵌套选择。我还根据当前日期检查了可用性,而不是availability
列,我认为不应将其存储在数据库中,因为它可以根据会议室日期确定。