MySQL 如何更正此子查询?

标签 mysql select join subquery

我有下表:

select * from points
+---------+-------------------+------+------+
| NAME    | TITLE             | Type | RANK |
+---------+-------------------+------+------+
| A       | Hippo             | H    |  1   |
| A       | Hippo             | M    |  1   |
| A       | Hippo             | H    | N/A  |
| A       | Hippo             | H    |  1   |
| A       | Hippo             | H    | N/A  |
| B       | Snail             | H    |  1   |
| B       | Snail             | M    |  1   |
| B       | Snail             | L    |  1   |
| C       | Dog               | H    |  1   |
| C       | Dog               | M    |  1   |
+---------+-------------------+------+------+

期望的输出

+---------+----------+-------+
| NAME    | TITLE    | SCORE |
+---------+----------+-------+
| A       | Hippo    |   60  | <--[(2xH)=40 + (1xM)=20] =60
| B       | Snail    |  100  | <--[(1xH)=70 + (1xM)=20 + (1xL)=10] =100
| C       | Dog      |  100  | <--This should happen because [(1xH)=80 + (1xM)=20] =100
+---------+----------+-------+

所需的计算:

  • 类型只能有三个值:{H, M, L};
  • 当所有值都存在时,它们的分级如下:

    高=70 米=20 长=10

  • 如果一个名称有不止一种类型(H、M 或 L),则点数分配如下:

  • H/(H 的数量); M/(M个数); L/(L的数量)= 100

-- 示例:A 有 4 个 H,因此每个 H 有 70/4 = 17.5

但有些名称具有完整的集合,但没有所有“类型”。 -- 示例:C 的类型值:仅 'H&M`

  • CASE H&M

高=80 米=20

  • 案例 M&L

M=60 L=40

  • CASE H&L

高=90 长=10

还有

  • 如果只有 H 是 presnet H=100

  • 如果只有 M 是 presnet M=100

  • 如果只有 L 是 presnet L=100

最佳答案

如果我没理解错的话,这就是你想要的:

SELECT name,
       title,
       CAST(
       (      -- only have H, or only have M, or only have L:
         CASE WHEN  `# of H` = 0  AND  `# of M` = 0  THEN  100 * `# of active L` / `# of L`
              WHEN  `# of H` = 0  AND  `# of L` = 0  THEN  100 * `# of active M` / `# of M`
              WHEN  `# of M` = 0  AND  `# of L` = 0  THEN  100 * `# of active H` / `# of H`
              -- only have H & M, or only have H & L, or only have M & L:
              WHEN  `# of H` = 0  THEN  60 * `# of active M` / `# of M` + 40 * `# of active L` / `# of L`
              WHEN  `# of M` = 0  THEN  0  -- ??????????
              WHEN  `# of L` = 0  THEN  80 * `# of active H` / `# of H` + 20 * `# of active M` / `# of M`
              -- have all three:
              ELSE  70 * `# of active H` / `# of H` + 20 * `# of active M` / `# of M` + 10 * `# of active L` / `# of L`
         END
       ) AS SIGNED ) AS score
  FROM ( SELECT name,
                title,
                SUM(IF(         type = 'H', 1, 0))  AS `# of H`,
                SUM(IF(rank AND type = 'H', 1, 0))  AS `# of active H`,
                SUM(IF(         type = 'M', 1, 0))  AS `# of M`,
                SUM(IF(rank AND type = 'M', 1, 0))  AS `# of active M`,
                SUM(IF(         type = 'L', 1, 0))  AS `# of L`,
                SUM(IF(rank AND type = 'L', 1, 0))  AS `# of active L`
           FROM points
          GROUP
             BY name,
                title
       ) t
 ORDER
    BY name
;

关于MySQL 如何更正此子查询?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9538501/

相关文章:

mysql - 从加入mysql获取矩阵表

Mysql DATE_ADD 不适用于 INTERVAL 保留字

mysql - 为 3 组中的每组获取一个随机记录

PhpMyAdmin:502 错误网关

javascript - 为什么下拉菜单下的部分颜色变浅?

python - SQLAlchemy 中的过滤关系

MySql bat脚本加载xml表错误

sql-server - SQL 大表选择随机行策略

MYSQL - 理解这个 SELECT 和 UNION ALL 查询

mysql - 连接同一张表来获取信息