Как сделать выражение внутри оператора select без его возврата в виде столбца? - PullRequest
3 голосов
/ 12 февраля 2009

У меня есть ряд строк в базе данных, которые я хочу вставить в другую базу данных. Поскольку есть довольно много строк, я хочу использовать конструкцию INSERT .. SELECT ... в mysql. Утверждение, которое я пытаюсь выполнить, выглядит следующим образом:

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 ...?

Ответы [ 3 ]

1 голос
/ 12 февраля 2009
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
1 голос
/ 12 февраля 2009

Вы можете скрыть приращение, используя что-то вроде:

SELECT IF(@currpoints := points, id, id)
0 голосов
/ 12 февраля 2009

Конечно, вы можете достичь того, что вам нужно, с помощью курсоров, но это может ухудшить производительность.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...