MySQL - 链接多个SQL命令

时间:2015-02-06 20:04:52

标签: mysql sql

我看过多个帖子,但似乎无法找到我问题的理想答案。我正在创建一个带有调度程序的系统,我需要多个链才能使查询返回答案。所以这是场景。用户需要注册并在注册时向用户显示日期。

  1. 我有用户表(显然)列出了用户表。这里有一栏有日期。
  2. 还有一个存储日期的日期表。每个日期只能容纳30人。
  3. 日期表还包含可用性列。如果日期可用,则标记为1.如果日期已过期(当前日期高于此日期),则标记为0.
  4. 例如,我有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中的结果房间

    如果我所寻找的链条可能不合适,我愿意接受不同的建议。谢谢。 :)

2 个答案:

答案 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列,我认为不应将其存储在数据库中,因为它可以根据会议室日期确定。