MySQL 我怎样才能实现这个查询?

标签 mysql subquery

我有以下模拟表:

+---------+-------------------+------+------+
| NAME    | TITLE             | SIZE |  Hit |
+---------+-------------------+------+------+
| A       | Hippo1            | H    |  0   |
| A       | Hippo2            | H    |  0   |
| A       | Hippo3            | H    |  1   |   
| A       | Hippo1            | M    |  0   |
| A       | Hippo2            | M    |  1   |
| A       | Hippo3            | M    |  1   |
| A       | Hippo1            | L    |  0   |
| A       | Hippo2            | L    |  1   |    
| A       | Hippo3            | L    |  1   |
+---------+-------------------+------+------+
| B       | Snail1            | H    |  1   |
| B       | Snail1            | M    |  0   |
| B       | Snail1            | L    |  1   |
+---------+-------------------+------+------+
| C       | Dog               | H    |  1   |
| C       | Dog               | M    |  0   |
+---------+-------------------+------+------+
| D       | Sheep             | H    |  0   |
| D       | Sheep             | L    |  1   |
+---------+-------------------+------+------+
| E       | Fish              | H    |  1   |
| E       | Fish              | H    |  1   |
+---------+-------------------+------+------+

我想要的结果是

+---------+----------+-------+
| NAME    | TITLE    | SCORE |
+---------+----------+-------+
| A       | Hippo    |  100  |
| B       | Snail    |   80  |
| C       | Dog      |   80  |
| D       | Sheep    |   10  |
| E       | Fish     |  100  |
+---------+----------+-------+

所需的计算:

  • Type最多只能有三个值:{H, M, L};
  • 当所有值都存在时,它们的分级如下:H=70 M=20 L=10
  • 所有独特的情况都是

    1. 案例{H,M}:H=80 M=20
    2. 案例{M,L}:M=60 L=40
    3. 案例 {H,L} : H=90 L=10
    4. 案例{H}:H=100
    5. 案例{M}:M=100
    6. 案例{L}:L=100
    7. 案例 {H,M,L}:H=70 M=20 L=10

解释:

Hippo Has case {H,M,L}
Snail has case {H,M,L}
Dog has case {H,M}
Sheep has case {H,L}
Fish has case {H} 

进一步说明

Hippo :虽然不是所有尺寸都有命中,但 Hippo 获得了 100 分,因为每个标题至少有 1 个案例被满足一次。因此 HIPPO3 具有所有三个 H M L 满足所以 hippo 可以被认为是 100% 找到

从上面提取(线条是观众的逻辑构造)

| A       | Hippo1            | H    |  0   |
| A       | Hippo2            | H    |  0   |
| A       | Hippo3            | H    |  1   | <--Here   
+-------------------------------------------+    
| A       | Hippo1            | M    |  0   |
| A       | Hippo2            | M    |  1   |
| A       | Hippo3            | M    |  1   | <--Here
+-------------------------------------------+   
| A       | Hippo1            | L    |  0   |
| A       | Hippo2            | L    |  1   |    
| A       | Hippo3            | L    |  1   | <--Here

最佳答案

给你:

select name, sum(FinalVal) Score from (
  select distinct t.name,
    case
      when size = 'H' then Hval
      when size = 'M' then Mval
      else Lval
    end FinalVal
  from (
    select name,
      case
        when sizes = 'H,L,M' then 70
        when sizes = 'H,M' then 80
        when sizes = 'H,L' then 90
        when sizes = 'H' then 100
        else 0
      end Hval,
      case
        when sizes = 'H,L,M' then 20
        when sizes = 'H,M' then 20
        when sizes = 'L,M' then 60
        when sizes = 'M' then 100
        else 0
      end Mval,
      case
        when sizes = 'H,L,M' then 10
        when sizes = 'L,M' then 40
        when sizes = 'H,L' then 10
        when sizes = 'L' then 100
        else 0
      end Lval
    from (
      select name, group_concat(distinct size order by size) sizes from t
      group by name
    ) s1
  ) s2
  join t on t.name = s2.name
  where hit
) final
group by name

不清楚如何在给定数据的情况下获取标题(实际上结果中包含原始表中不存在的数据,例如 Hippo,而不是 Hippo1. 但我会把它留给你。

这将导致:

+------+-------+
| NAME | SCORE |
+------+-------+
| A    |   100 |
| B    |    80 |
| C    |    80 |
| D    |    10 |
| E    |   100 |
+------+-------+

关于MySQL 我怎样才能实现这个查询?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9811980/

相关文章:

mysql - 如何创建按标签组织的数据库

mysql - 使用半正矢公式与 MySQL 的两个坐标表最接近的匹配

mysql - 从 3 个不同的列中选择不同的记录

mysql - 单表子查询

php - 在 mySQL 中查询,以随机顺序从每个 'purpose' 11 中选择 44 个问题 PHP/Laravel

mysql - 如何从 URL 构建 Laravel Eloquent 查询字符串?

mysql - 字段 "subject_name"没有默认值

mysql - 当 SET NAMES 与表的字符集不匹配时会发生什么?

sql - 别名在子查询中传递错误数据

sql - 无法执行sql查询