MySQL查询以迭代方式为字段赋值

时间:2013-06-13 09:59:06

标签: mysql sql

我正在使用包含500,000条记录的MySql表。该表包含一个字段(abbrevName),它存储另一个字段name的前两个字母的双字符表示。

例如AA AB AC等。

我想要实现的是设置另一个字段(pgNo)的值,该字段存储页码的值,基于记录abbrevName的值。

因此,缩写为“AA”的记录可能会获得1的页码,“AB”可能会得到2的页码,依此类推。

问题在于,虽然多个记录可能具有相同的页码(毕竟多个实体的名称可能以'AA'开头),但一旦具有相同页码的记录数达到250,页码必须增加一个人。因此,在页面编号为1的250个“AA”记录之后,我们必须分配更多的'AA记录,页码为2,依此类推。

My Pseudocode看起来像这样:

-Count distinct abbrevNames
-Count distinct abbrevNames with more than 250 records
-For the above abbrevNames count the the sum of each divided by 250
-Output a temporary table sorted by abbrevName
-Use the total number of distinct page numbers with 250 or less records to assign page numbers incrementally

我真的很难在一个接近这个的查询中放置任何东西,任何人都可以帮助我的逻辑或一些代码吗?

1 个答案:

答案 0 :(得分:2)

请试试这个:

SELECT abbrevNames, CAST(pagenumber AS signed) as pagenumber FROM (
    SELECT
    abbrevNames
    , IF(@prev = abbrevNames, @rows_per_abbrev:=@rows_per_abbrev + 1, @pagenr:=@pagenr + 1)
    , @prev:=abbrevNames
    , IF(@rows_per_abbrev % 250 = 0, @pagenr:=@pagenr + 1, @pagenr) AS pagenumber
    , IF(@rows_per_abbrev % 250 = 0, @rows_per_abbrev := 1, @rows_per_abbrev)
    FROM
    yourTable
    , (SELECT @pagenr:=0, @prev:=NULL, @rows_per_abbrev:=0) variables_initialization
    ORDER BY abbrevNames
) subquery_alias

更新:我有点误解了这个问题。现在它应该工作