【问题标题】:MySQL how can I achieve this query?MySQL如何实现这个查询?
【发布时间】:2012-03-21 20:02:09
【问题描述】:

我有以下模拟表:

+---------+-------------------+------+------+
| 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  |
+---------+----------+-------+

需要计算:

  • 类型最多只能有三个值:{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 Lsatsified 所以 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

【问题讨论】:

  • 除非你真的有动物园;)这是作业吗?
  • 如果是的话没关系,我们会提供帮助,如果是的话,只需要这样标记。
  • 不,我向你保证这不是家庭作业
  • 标题后面总是最多一位吗?
  • @MichaelDurrant 我不能说我见过有河马的动物园;)

标签: mysql subquery


【解决方案1】:

给你:

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 |
+------+-------+

【讨论】:

  • 我不知道那里发生了什么,但我尝试了你上面提供的东西,但没有运气
  • 我尝试修改 fiddle 以供您查看,但更改并没有保持不变。 fiddle 是否只允许创作者修改?
  • 当您修改它时,URL 会发生变化,您必须共享该新链接。原件将保持不变
  • 如果您愿意,请查看上面的修订。谢谢莫斯蒂·莫斯塔乔
  • 对不起,@stackoverflow,上一个问题已经很复杂了(70 次查看只有 1 个答案),这是一个不同的问题。这意味着从头开始,这会使我以前的努力毫无用处。我认为您应该做的是将其标记为已接受(因为答案是准确的),并使用真实表格创建一个新表格。我现在无法处理此问题,但稍后我会检查您的个人资料并查看您发布的任何其他问题,并在需要时尝试提供答案。但是,请确保您不要更改其他问题的要求。谢谢
猜你喜欢
  • 2019-05-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-21
  • 2011-09-13
  • 2020-11-21
  • 2010-11-15
相关资源
最近更新 更多