【问题标题】:How do I make an expression inside a select statement without it being returned as column?如何在不作为列返回的情况下在 select 语句中创建表达式?
【发布时间】:2009-02-12 15:03:43
【问题描述】:

我有一些来自数据库的行,我想插入到另一个数据库中。由于有很多行,我想在 mysql 中使用 INSERT .. SELECT ... 构造。我尝试运行的语句如下:

set @rank := 1; set @currpoints := 0; set @currgroupcount := 0; 
  SELECT id, @rank := if( @currpoints = points, @rank , @rank + @currgroupcount )
  AS rank, 
  @currgroupcount := if( @currpoints = points, @currgroupcount +1, 1 ) , @currpoints := 
  points
FROM characters
ORDER BY points DESC , name
LIMIT 0 , 30

问题是当结果超过两列时,我无法将选定的行插入数据库。有什么方法可以在不将表达式作为列返回的情况下进行这些所需的增量?如果不可能,您是否知道我可以做些什么作为替代方案,并且仍然能够获得使用 INSERT .. SELECT ... 构造所带来的性能提升?

【问题讨论】:

    标签: mysql


    【解决方案1】:
    INSERT
    INTO new_characters (id, name)
    SELECT id, name
    FROM (
      SELECT id,
      @rank := if( @currpoints = points, @rank , @rank + @currgroupcount ) AS rank, 
      @currgroupcount := if( @currpoints = points, @currgroupcount +1, 1 ),
      @currpoints := points
      FROM characters
      ORDER BY points DESC , name
      LIMIT 0 , 30
    ) m
    

    【讨论】:

      【解决方案2】:

      您可以使用以下方式隐藏增量:

      SELECT IF(@currpoints := points, id, id)
      

      【讨论】:

        【解决方案3】:

        您当然可以通过使用游标来实现您所需要的,但可能会影响性能。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2013-05-29
          • 1970-01-01
          • 1970-01-01
          • 2020-01-28
          • 2022-09-29
          • 2017-10-26
          相关资源
          最近更新 更多