MYSQL:根据集合中其他字段的值设置模型编号

时间:2015-04-22 03:09:45

标签: mysql sql

我被赋予了一项我并不真正同意的奇怪任务,但现在是:

我的数据集超过200万个属性,分为40,000多个细分。在每个细分中,我应该根据生活区域DESC,卧室DESC,仅使用MySQL查询的浴室DESC生成模型编号。

由此我的意思是复杂/细分中最大的模型是模型1,下一个最大模型是2.如果两个是相同的大小,那么下一个有更多卧室的模型。如果起居区和卧室相同,则浴室计数设置下一个型号。

例如:

property id | complex id | Living area | Beds | Baths | Model (assigned)
------------------------------------------------------------------------
      1     |   A1       |    1900     | 3    |  2    |  1
      2     |   A1       |    1200     | 2    |  2    |  2
      3     |   A1       |    1200     | 2    |  2    |  2
      4     |   A1       |    1000     | 2    |  2    |  3
      5     |   A2       |    1500     | 3    |  2    |  2 
      6     |   A2       |    3500     | 6    |  4    |  1
      7     |   A2       |    1000     | 2    |  2.5  |  3
      8     |   A3       |    600      | 1    |  1.5  |  1
      9     |   A3       |    600      | 1    |  1    |  2    
      10    |   A3       |    500      | 1    |  1    |  3     
      11    |   A4       |    500      | 1    |  1    |  1      
      12    |   A5       |    2000     | 4    |  3    |  1      
      13    |   A5       |    1800     | 4    |  4    |  2      
      14    |   A5       |    1500     | 3    |  2    |  3      
      15    |   A5       |    1200     | 3    |  2    |  4      
      16    |   A5       |    1000     | 2    |  2.5  |  5      
      17    |   A5       |    800      | 2    |  2    |  6      
      18    |   A5       |    750      | 2    |  1    |  7      
      19    |   A5       |    750      | 2    |  1    |  7     
      20    |   A5       |    600      | 1    |  1    |  8      
      21    |   A5       |    600      | 1    |  1    |  8      
      22    |   A5       |    600      | 1    |  1    |  8      

仅使用mysql,我如何以这种方式分配型号?同样,这应该只使用MySQL查询来完成。我可以编写mysql函数,但可能不会使用php,asp,c#等。

感谢您花些时间尝试解决此问题。

1 个答案:

答案 0 :(得分:2)

试试这个,我认为它可以做你想要的:

     select *, 
       if(@prevcomplex = complex_id, 
          if(@prevlayout = concat(living_area, ',', beds, ',', baths),
             @rank := @rank,
             if(@prevlayout := concat(living_area, ',', beds, ',', baths),
                @rank := @rank + 1,
                @rank := @rank + 1
             )
          ),              
          if(@prevcomplex := complex_id, 
             @rank := 1, @rank := 1)
       ) model 
  from data, (select @rank := 0)q 
  order by complex_id asc, living_area desc, beds  desc, baths desc;

这里有一个演示:http://sqlfiddle.com/#!9/d10d85/10