2011-09-26 94 views
0

我需要得到一个记录集,我填了场1级为每60条记录,意味着我需要填写1级领域是这样的:MySQL的副位置计数器

  • 在POS = 1和POS = 60 1级= 1
  • 上POS = 61和POS = 120 1级
  • = 2
  • 上POS = 121和POS = 180与1级= 3

... 然后:如果我让' s说我必须为pos = 601和630 level1 = 10设置630条记录,因为我没有660条记录,第630条记录完成了这个级别。

有没有人有一个想法如何以干净的方式做到这一点?

SET @pos:=0; 
SET @posrel:=0; 
SET @level1:=0; 
SELECT id, member_id, member_name, pos, @posrel:[email protected]+1 AS posrel, @level1:[email protected]+??? AS level1 
FROM 
(
    SELECT id, member_id, LEFT(member_name, LENGTH(member_name)-36) AS member_name, @pos:[email protected]+1 AS pos FROM member_directory WHERE member_name_first= 'A' 
) AS directory_listing 
HAVING pos % 60 IN(0,1); 
+0

这不是寻呼,对不对?因为如果是这样,你做错了。 –

+0

@Adrian:不,它用于目录列表(seo)。我们有超过1亿条记录,需要将它们拆分成多个级别 – nenad007

回答

1
-- SET @pos:=0; //Can be moved inside the query. 
-- SET @posrel:=0; 
SELECT inner.*, posrel DIV 60 as level1 FROM (
    SELECT directory_listing.*, @posrel:[email protected]+1 AS posrel AS level1 
    FROM 
    (
    SELECT 
     id 
     , member_id 
     , LEFT(member_name, LENGTH(member_name)-36) AS member_name_first 
     , @pos:[email protected]+1 AS pos 
    FROM member_directory 
    CROSS JOIN (SELECT @pos:= 0) x1 
    WHERE member_name_first = 'A' 
    AND directory_listing.pos < 120 
) directory_listing 
    CROSS JOIN (SELECT @posrel:= 0) x2 
) inner 

或许

-- SET @pos:=0; //Can be moved inside the query. 
-- SET @posrel:=0; 
SELECT inner.*, posrel DIV 60 as level1 FROM (
    SELECT directory_listing.*, @posrel:[email protected]+1 AS posrel AS level1 
    FROM 
    (
    SELECT 
     id 
     , member_id 
     , LEFT(member_name, 1) AS member_name_first 
     , @pos:[email protected]+1 AS pos 
    FROM member_directory 
    CROSS JOIN (SELECT @pos:= 0) x1 
    WHERE member_name LIKE 'A%' 
    AND directory_listing.pos < 120 
) directory_listing 
    CROSS JOIN (SELECT @posrel:= 0) x2 
) inner 
+0

它看起来非常好,我会在接下来的30分钟内测试它(服务器此刻正忙碌),并让您知道 – nenad007

+0

这两个查询都失败。 。',posrel DIV 60作为level1 FROM( SELECT directory_listing。*,@posrel:= @'in line 1 any idea? – nenad007

+0

我修正了查询,但它没有提供它需要什么,pos字段不再是正确的,记录集只有60条记录,并且每行都填充了关卡。欢迎任何帮助:-) – nenad007