2011-09-04 46 views
1

我有一個MySQL查詢,從多個表中選擇數據,然後下令基於如下一些任意標準的結果:MySQL的順序排名爲列

SELECT [columns] FROM (
    SELECT *, COUNT(*) as `matches` 
    FROM [table1] 
    JOIN [table2] USING (id) 
    JOIN [table3] USING (id) 
    WHERE [criteria] 
    GROUP BY `id` 
    ORDER BY `matches` DESC 
) AS `grouped` 
ORDER BY (
    (CASE WHEN [1st rank criteria] THEN 3 ELSE 0 END) + 
    (CASE WHEN [2nd rank criteria] THEN 2 ELSE 0 END) + 
    (CASE WHEN [3rd tank criteria] THEN 1 ELSE 0 END) 
) DESC 
LIMIT 100 

這工作得很好,但我的問題是:我可以將排名分數顯示爲列?我已經着眼於嘗試使用變量,但我對SQL很陌生,所以這些都超出了我的想象。

對不起,如果這是一個明顯的問題,但非常感謝您的時間和協助。

回答

5

試試這個:

SELECT [columns], 
    (
    (CASE WHEN [1st rank criteria] THEN 3 ELSE 0 END) + 
    (CASE WHEN [2nd rank criteria] THEN 2 ELSE 0 END) + 
    (CASE WHEN [3rd tank criteria] THEN 1 ELSE 0 END) 
    ) AS MyRank 

FROM (
    SELECT *, COUNT(*) as `matches` 
    FROM [table1] 
    JOIN [table2] USING (id) 
    JOIN [table3] USING (id) 
    WHERE [criteria] 
    GROUP BY `id` 
    ORDER BY `matches` DESC 
) AS `grouped` 
ORDER BY MyRank DESC 
LIMIT 100; 
+0

完美!我沒有意識到CASE可以按照這個順序排列。非常感謝您的及時和有用的回覆! – Superangel

2

把它放在選擇

((CASE WHEN [1st rank criteria] THEN 3 ELSE 0 END) + 
(CASE WHEN [2nd rank criteria] THEN 2 ELSE 0 END) + 
(CASE WHEN [3rd tank criteria] THEN 1 ELSE 0 END)) as ranking 
+0

非常感謝您!你是絕對正確的。我感謝您的幫助。 – Superangel