2015-02-06 60 views
0

我看過多個線程,但似乎無法找到我的問題的理想答案。我正在創建一個帶有調度程序的系統,爲了查詢返回一個答案,我需要多個鏈。所以這裏是場景。用戶需要註冊並在註冊後向用戶呈現日期。MySQL - 鏈接多個SQL命令

  1. 我有用戶列表(顯然)的用戶列表。這裏有一列有日期。
  2. 還有一個存儲日期的日期表。每個日期只能佔用30人。
  3. 日期表中還有可用性列。如果日期可用,則標記爲1.如果日期已過期(當前日期高於此日期),則標記爲0.

例如,我的日期爲1月1日,1月2日和1月3日,當前日期爲1月2日。顯然,1月1日應該過期。這不會包含在列表中,因此我將可用性設置爲0(是,手動)。只有1月2日和1月3日。我還需要找出1月2日是否容納了30人。否則,我需要把他帶到Jan 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

如果我一直在尋找的鏈接可能是不可取的,我願意接受不同的建議。謝謝。 :)

+1

我不明白查詢1的輸出。你說'WHERE availability = 0',爲什麼它顯示'availability = 1'的房間? – Barmar 2015-02-06 20:12:44

+0

您在頂部列出了兩個表:「用戶」和「日期」。查詢1中的「房間」表格是什麼? – Barmar 2015-02-06 20:14:55

回答

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

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列,我認爲這不應該存儲在數據庫中,因爲它可以根據房間日期確定。