2012-02-27 88 views
0

我正在嘗試創建一個自定義排序,該排序涉及另一個表中某些記錄的計數。例如,如果一個記錄在另一個表中沒有與其關聯的記錄,則它應該在排序中看起來高於具有一個或多個記錄的記錄。這是我到目前爲止:MySQL用子查詢評估案例

SELECT People.*, Organizations.Name AS Organization_Name, 
    (CASE 
     WHEN Sent IS NULL AND COUNT(SELECT * FROM Graphics WHERE People.Organization_ID = Graphics.Organization_ID) = 0 THEN 0 
     ELSE 1 
    END) AS Status 
FROM People 
LEFT JOIN Organizations ON Organizations.ID = People.Organization_ID 
ORDER BY Status ASC 

COUNT內的子查詢不起作用。什麼是這樣做的正確方法?

更新:我感動case語句到order by條款,並增加了join

SELECT People.*, Organizations.Name AS Organization_Name 
FROM People 
LEFT JOIN Organizations ON Organizations.ID = People.Organization_ID 
LEFT JOIN Graphics ON Graphics.Organization_ID = People.Organization_ID 
GROUP BY People.ID 
ORDER BY 
    CASE 
    WHEN Sent IS NULL AND Graphics.ID IS NULL THEN 0 
    ELSE 1 
    END ASC 

所以,如果如果People記錄沒有任何圖形,Graphics.ID將是無效的。這實現了迫切需要。

+0

這裏有什麼問題? – AndreKR 2012-02-27 18:44:05

回答

0

如果你試圖不通過加入對一個子查詢,置CASE表達成ORDER BY以及工作,這是可以做到:

SELECT 
    People.*, 
    orgcount.num 
FROM People JOIN (
    SELECT Organization_ID, COUNT(*) AS num FROM Graphics GROUP BY Organization_ID 
) orgcount ON People.Organization_ID = orgcount.num 
ORDER BY 
    CASE WHEN Sent IS NULL AND orgcount.num = 0 THEN 0 ELSE 1 END, 
    orgcount.num DESC 
0

你可以使用一個外部連接的圖形表獲取你的排序所需的數據。

因爲我不知道你的模式,所以我假定People表有一個名爲ID的主鍵列。如果PK欄的名稱不同,則應替換GROUP BY子句中的名稱。與JOIN只要你有某種在人民表,以集團的主鍵的左

SELECT People.*, (count(Distinct Graphics.Organization_ID) > 0) as Status 
FROM People 
LEFT OUTER JOIN Graphics ON People.Organization_ID = Graphics.Organization_ID 
GROUP BY People.ID 
ORDER BY Status ASC 
0

相當直截了當;:

像這樣的東西應該爲你工作

SELECT p.*, sent IS NOT NULL or COUNT(g.Organization_ID) Status 
FROM People p LEFT JOIN Graphics g ON g.Organization_ID = p.Organization_ID 
GROUP BY p.primary_key 
ORDER BY Status 

演示here