2017-04-27 60 views
0

我想爲特定事件生成一個類似的列表,其中當前註冊的志願者人數低於所需的數量。我使用的MySQL:使用子查詢的SQL

Volunteer Role 
============== 
Stewarding 
Video 

我的表(急救不會因爲已經有2人簽署了這支球隊出現)是:

Delegate 
======== 
OrderId Name  volunteerOption 
1   Tim  
1   Jane  First Aid 
1   Mary  First Aid 
1   Jo  Stearding 


VolunteerRole 
=========== 
eventId volunteerName quantityNeeded 
1   First Aid  2 
1   Stewarding  10 


Orders 
====== 
Id  eventId 
1   1 

Event 
===== 
id  name 
1  Fun Run 

我想我需要使用加入的子查詢,但我不知道如何鏈接它們。

這兩個查詢我的是:

SELECT roleName, quantity as size 
FROM VolunteerRole 
WHERE eventId = 1 

這給了我,給了我的志願者在各隊目前的量的隊名和最大尺寸

SELECT DISTINCT count(volunteerOption) as volunteers, volunteerOption 
FROM delegate 
JOIN orders on delegate.orderId = orders.id 
WHERE orders.eventId = 1 and volunteerOption <> '' 
GROUP BY volunteerOption 

。我無法弄清楚的是如何只選擇志願者人數少於最大值的球隊。

任何幫助感激收到

+0

是'蒂姆'的意思是'videoer'的'volunteerOption'值? – toonice

+0

每個'Event'都可以有很多'Order'嗎? – toonice

+0

由於GROUP BY不返回任何重複,因此無需執行SELECT DISTINCT。 – jarlh

回答

0

這給你事項標識,ORDER_ID,employee_type,employee_needed無論你需要一些:

SELECT a.id as event_id, b.id as order_id, d.volunteerOption, c.quantityNeeded-d.employeed as still_to_find 
FROM events a 
LEFT JOIN orders b ON a.id=b.eventId 
LEFT JOIN VolunteerRole c ON a.id=c.eventId 
LEFT JOIN (SELECT order_id, volunteerOption, COUNT(*) as employeed FROM Delegate WHERE volunteerOption IS NOT NULL GROUP BY order_id, volunteerOption) d ON b.id=d.order_id AND c.volunteerName=d.volunteerOption 
WHERE c.quantityNeeded<d.employeed 
0

我認爲你將不得不做,在兩個步驟,因爲你可以」牛逼檢查的彙總值對非凝集的一個

select distinct volunteerName 
from (
      SELECT t1.volunteerName, t1.quantityNeeded, count(t2.Name) as cnt 
      FROM VolunteerRole t1 
      JOIN Orders t2 
      ON  t1.eventId = t2.eventId 
      LEFT JOIN 
        Delegate t3 
      ON  t1.VolunteerName = t3.volunteerOption and 
        t2.Id = t3.OrderId 
      WHERE t1.eventId = 1 
     ) t1 
where quantityNeeded > cnt 
1

請嘗試以下...

SELECT volunteerName AS 'Volunteer Role' 
FROM (SELECT volunteerName AS volunteerName, 
       quantityNeeded AS quantityNeeded, 
       COUNT(volunteerOption) AS volunteersCount 
     FROM Delegate 
     JOIN Orders ON Delegate.OrderId = Orders.Id 
     RIGHT JOIN VolunteerRole ON Orders.eventId = VolunteerRole.eventId 
           AND Delegate.volunteerOption = VolunteerRole.volunteerName 
     WHERE Orders.eventId = 1 
     GROUP BY volunteerName, 
       quantityNeeded 
    ) AS volunteersCountFinder 
WHERE quantityNeeded > volunteersCount 
GROUP BY volunteerName; 

該聲明首先執行DelegateOrders之間的INNER JOIN,向我們提供了分配給每個訂單的代理人列表,從而分配給每個事件。

此列表然後右鍵聯接到VolunteerRole,給我們一個代表分配給每個事件該事件中的每個角色的代表名單。執行RIGHT JOIN而不是INNER JOIN,這樣即使沒有分配代理人,仍然會列出事件中的角色。請注意,RIGHT JOINLEFT JOIN大致相同。你使用的是哪一邊的JOIN有哪張表保留不匹配的記錄。

然後通過WHERE子句將由兩個連接產生的數據集細化爲eventId1的那些記錄。

然後將細化的數據集按volunteerName分組。通過quantityNeeded分組不會有效地細化或擴大volunteerName的分組,因爲volunteerName的每個值只有一個對應值quantityNeeded,但GROUP BY要求您使用非聚合函數生成的所有字段進行分組。

然後計算每個非NULLvolunteerOption的計數。 COUNT()將返回0其中一個角色沒有分配的代表,即在那裏遇到一個NULL值,而一個非NULLvolunteerOptionvolunteerName這裏混淆,這將永遠在每條記錄的值)。

子查詢然後返回一個列表,其中包含每個volunteerName及其對應的quantityNeededvolunteersCount(給予我們的計數的別名)。

然後,主要查詢將子查詢的數據集細化爲只需要那些數量大於指定志願者和組的結果volunteerName的結果的數據集。這個組中的每個值volunteerName然後由該語句返回。

如果您有任何問題或意見,請隨時發佈相應評論。

附錄

如果您希望延長本聲明列出了充分每個那些充滿不充分的角色一起,你可以使用填充角色的所有事件...

SELECT eventId, 
     volunteerName AS 'Volunteer Role' 
FROM (SELECT Orders.eventId AS eventId, 
       volunteerName AS volunteerName, 
       quantityNeeded AS quantityNeeded, 
       COUNT(volunteerOption) AS volunteersCount 
     FROM Delegate 
     JOIN Orders ON Delegate.OrderId = Orders.Id 
     RIGHT JOIN VolunteerRole ON Orders.eventId = VolunteerRole.eventId 
           AND Delegate.volunteerOption = VolunteerRole.volunteerName 
     GROUP BY Orders.eventId, 
       volunteerName, 
       quantityNeeded 
    ) AS volunteersCountFinder 
WHERE quantityNeeded > volunteersCount 
GROUP BY eventId, 
     volunteerName; 
0

嘗試這個查詢。這應該工作正常

select distinct volunteerName from (SELECT t1.volunteerName, t1.quantityNeeded, count(t2.Name) as cnt FROM VolunteerRole t1 JOIN Orders t2 ON  t1.eventId = t2.eventId 
LEFT JOIN Delegate t3 ON t1.VolunteerName = t3.volunteerOption and t2.Id = t3.OrderId WHERE t1.eventId = 1 
) t1 where quantityNeeded > cnt;