2013-08-10 3 views
1

Проблема: У меня есть хранимая процедура MySQL, и я хочу, чтобы каждый раз, каждый предыдущий запуск, и я не могу инициализировать его до нуля.MySQL Сохраненная процедура с вставкой Выбор и пользовательская переменная

Деталь: У меня есть таблица данных (так называемого data), который я читать и затем генерировать записи в соотношении 1 к 1 в другой таблице (так называемой results). Я делаю это в хранимой процедуре, в которой используется оператор Insert Select. Я также использую переменную пользователя @mycount, которая увеличивается с каждой строкой. Вот упрощенная версия моего кода:

DELIMITER // 
CREATE PROCEDURE doSomething 
BEGIN 
    SET @mycount := 0; 
    INSERT INTO results (data_id, mycounter) 
     SELECT data.id, (@mycount := @mycount+1) 
     FROM data LEFT JOIN results ON data.id = results.data_id 
     WHERE ... GROUP BY ... 
     HAVING ... 
     ORDER BY ...; 
END // 
DELIMITER ; 

Анализ: Это работает почти по желанию, за исключением мне нужно @mycount обнулить каждый раз, когда он запускается и SET выше утверждение не достигает этого. При отладке я вижу, что последнее значение @mycount всегда запоминается из предыдущего запуска хранимой процедуры. Я также попытался установить его на ноль после вставки.

Примечание:

  1. Я использую @ переменные для увеличения и отслеживать номер строки. Может быть, здесь есть еще один вариант?
  2. Проблема связана с условием наличия. Когда я запускаю аналогичный, но другой запрос без предложения предложения, переменная сбрасывает проблему.

Вопрос: Почему я не могу установить @mycount до нуля перед запуском каждый раз? Если он сбрасывается, и только в том, что предложение «Мой» вызывает неожиданный подсчет, есть ли лучший способ переписать мой SQL?

Я надеюсь, что кто-то столкнется с чем-то подобным, так как это кажется довольно неясным.

+0

возможный дубликат [Как SELECT \ * INTO \ [temp table \] FROM \ [хранимая процедура \]] (http://stackoverflow.com/questions/653714/how- to-select-in-temp-table-from-stored-procedure) – Jackcob

+0

@Jackcob Nope, совсем нет. – sh0ber

ответ

0

Я не могу найти причину, по которой ваш код не должен работать. В любом случае, попробуйте метод ниже.

INSERT INTO results (data_id, mycounter) 
select a.id, a.cnt from (
select @mycount := 0 from dual 
join (SELECT data.id, (@mycount := @mycount+1) cnt 
     FROM data LEFT JOIN results ON data.id = results.data_id 
     WHERE ... GROUP BY ...)) a; 

В этом случае вам не нужно указать SET @mycount := 0;

+0

Вы также можете попробовать что-то вроде: 'INSERT INTO результаты (data_id, MYCounter) SELECT, data.id (@mycount: = @mycount + 1) FROM (SELECT @mycount: = 0) дер, данные LEFT JOIN результаты ON data.id = results.data_id; ' – wchiquito

0

В следующем SQL Fiddle я не могу воспроизвести проблему вы позы, в теории работает, как ожидалось.

UPDATE

Try:

DELIMITER // 

CREATE PROCEDURE doSomething() 
BEGIN 
    SET @mycount := 0; 
    INSERT INTO results (data_id, mycounter) 
     SELECT der.id, (@mycount := @mycount + 1) 
     FROM (
      SELECT data.id 
      FROM data 
       LEFT JOIN results ON data.id = results.data_id 
      WHERE ... 
      GROUP BY ... 
      HAVING ... 
      ORDER BY ... 
     ) der; 
END // 

DELIMITER ; 
+0

Настолько странно, что каким-то образом он сохраняет свою ценность в моем коде. Я пробовал ответы до сих пор на этой странице, и в каждом случае значение сохраняется от одного вызова к другому. Я предполагаю, что в моей процедуре должна быть какая-то другая проблема. – sh0ber

+0

Как вы называете хранимую процедуру? Вы используете командную строку MySQL или используете определенную среду IDE? – wchiquito

+0

Я вызываю его в PHP-скрипте. Может ли это иметь какое-то отношение к тому факту, что это переменная '@'? Есть ли способ использовать внесеансовую переменную (без '@') в этом контексте? – sh0ber