MySQL:如何通过对特殊记录给予特定分数来对select进行排序

MySQL:如何通过对特殊记录给予特定分数来对select进行排序,mysql,sql,select,Mysql,Sql,Select,我有一个简单的表格,例如: id | name | category ------------------------ 1 | banana | 1 2 | orange | 1 3 | fruit | 1 4 | potato | 2 5 | car | 0 我有很多特殊的过滤器,应该为列表指定一个特殊的分数来显示。 以下是此示例的机制: 如果名称为香蕉或橙色,则分数=分数+2 如果名称为水果,则分数=分数+1 如果名称为马铃薯,则分数=分数+0 如果类别>0,分数=分

我有一个简单的表格,例如:

id | name   | category
------------------------
1  | banana | 1
2  | orange | 1
3  | fruit  | 1
4  | potato | 2
5  | car    | 0
我有很多特殊的过滤器,应该为列表指定一个特殊的分数来显示。 以下是此示例的机制:

如果名称为香蕉或橙色,则分数=分数+2 如果名称为水果,则分数=分数+1 如果名称为马铃薯,则分数=分数+0 如果类别>0,分数=分数+1 所以在我的结果中我需要

id | name   | category | score
-------------------------------
1  | banana | 1        | 3 ( condition 1+4)
2  | orange | 1        | 3 ( condition 1+4)
3  | fruit  | 1        | 2 ( condition 2+4)
4  | potato | 2        | 1 ( condition 3+4)
5  | car    | 0        | 0 ( no match)
最后我想按分数排序结果。 我无法创建新列,因为条件是由用户选择的。 什么是MySQL查询?

一种可能的方法:

SELECT id, name, category,
       IF(category > 0, 1, 0) + 
       (CASE name WHEN 'banana' THEN 2
                 WHEN 'orange' THEN 2
                 WHEN 'fruit' THEN 1
                 ELSE 0 END)
        AS score
FROM ttt
ORDER BY score DESC
一种可能的办法:

SELECT id, name, category,
       IF(category > 0, 1, 0) + 
       (CASE name WHEN 'banana' THEN 2
                 WHEN 'orange' THEN 2
                 WHEN 'fruit' THEN 1
                 ELSE 0 END)
        AS score
FROM ttt
ORDER BY score DESC
您可以这样做:

SELECT 
  id, 
  name, 
  category, 
  nameCondition + catCondition AS Score
FROM
(
    SELECT
      id, name, category,
      CASE 
        WHEN name IN ('banana', 'orange') THEN 2
        WHEN name = 'fruit'               THEN 1
        WHEN name = 'potato'              THEN 0
        ELSE 0
       END AS nameCondition,
       CASE 
         WHEN  category > 0 THEN 1 
         ELSE 0 
       END AS catCondition
    FROM tablename
) AS t;

这将为您提供:

| ID |   NAME | CATEGORY | SCORE |
----------------------------------
|  1 | banana |        1 |     3 |
|  2 | orange |        1 |     3 |
|  3 |  fruit |        1 |     2 |
|  4 | potato |        2 |     1 |
|  5 |    car |        0 |     0 |
您可以这样做:

SELECT 
  id, 
  name, 
  category, 
  nameCondition + catCondition AS Score
FROM
(
    SELECT
      id, name, category,
      CASE 
        WHEN name IN ('banana', 'orange') THEN 2
        WHEN name = 'fruit'               THEN 1
        WHEN name = 'potato'              THEN 0
        ELSE 0
       END AS nameCondition,
       CASE 
         WHEN  category > 0 THEN 1 
         ELSE 0 
       END AS catCondition
    FROM tablename
) AS t;

这将为您提供:

| ID |   NAME | CATEGORY | SCORE |
----------------------------------
|  1 | banana |        1 |     3 |
|  2 | orange |        1 |     3 |
|  3 |  fruit |        1 |     2 |
|  4 | potato |        2 |     1 |
|  5 |    car |        0 |     0 |