2011-09-04 44 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