以下是我的查询:
select id, Column2, Column3, ..., Column9, Column10, Column11
from (select id, Column2, Column3, ..., Column9, Column10, Column11,
@num := if(@group = Column3, @num + 1, 1) as row_number,
@group := Column3 as dummy from TABLE order by Column3) as x
where
row_number <= 8
and Column9 = 'value1'
and Column10 = 'value2'
limit 1000 for update;当Column3的不同值的数量大于一个时,它就能很好地工作。表中可以有数千行,但如果所有行都具有相同的Column3值,则此查询将不返回任何内容。
如果我随后添加了一个新行,其中Column3是不同的,那么它再次工作(下一次只会失败)。
如果有帮助的话,一些背景:如果我设置的话,Column3将是一个外键。因此,查询的目标是将数据分散到Column3上--只要返回的行总数小于1000 (在生产过程中,所有这些都随每个查询而变化,据我所知,除本例外),就抓取8种不同的组。
编辑:,我已经部分弄明白了。这与我所利用的MySQL特定特性相关,它比二次row_number()要快得多。
select @num := if(@group = Column3, @num + 1, 1) as row_number,
@group := Column3 from runTimeURLStorage;一遍又一遍地运行上面的查询,@num只会增加每次调用的数量,除非执行如下操作:
set @num = 1;当Column3有多个值时,'set @num = 1;‘将在外壳下调用。我可能会打个电话到'set @num = 1;‘在同一个连接上.
发布于 2014-05-09 18:05:20
我得打个电话给:
set @num = 1;在执行主查询之前,在同一连接上只有一个不同的Column3值,否则MySQL会缓存来自以前调用的@num的值。
https://stackoverflow.com/questions/23569565
复制相似问题