Вложенные циклы MySQL

1 23
C
На сайте с 04.02.2005
Offline
291
#21

Давай ты проведешь эксперимент

заходишь в пхпмайадмин

1.SQL

SET @i:=0;

UPDATE `links` SET rng = @i:=@i + `freq` WHERE `from_id` = 1

смотри результат

2. SQL

SET @i:=3;

UPDATE `links` SET rng = @i:=@i + `freq` WHERE `from_id` = 1

Смотри результат

3.

SQL

SET @i:=0;

SQL

UPDATE `links` SET rng = @i:=@i + `freq` WHERE `from_id` = 1

Смотри результат

sidorka
На сайте с 17.08.2012
Offline
211
#22

По одному работает. В цикле не работает. Попробуй запусти.

---------- Добавлено 07.11.2013 в 19:10 ----------

Я эти эксперименты весь день ставил, пока к курсору не пришел.

---------- Добавлено 07.11.2013 в 19:19 ----------

Chukcha:
Давай ты проведешь эксперимент

заходишь в пхпмайадмин

1.SQL
SET @i:=0;
UPDATE `links` SET rng = @i:=@i + `freq` WHERE `from_id` = 1

смотри результат


2. SQL

SET @i:=3;
UPDATE `links` SET rng = @i:=@i + `freq` WHERE `from_id` = 1

Смотри результат

3.
SQL
SET @i:=0;

SQL
UPDATE `links` SET rng = @i:=@i + `freq` WHERE `from_id` = 1

Смотри результат

Но для чистоты эксперимента провел

1.

SET @i:=0;# MySQL вернула пустой результат (т.е. ноль строк).


UPDATE `links` SET rng = @i:=@i + `freq` WHERE `from_id` = 1# Затронуто 2 строки.

2.

SET @i:=3;# MySQL вернула пустой результат (т.е. ноль строк).


UPDATE `links` SET rng = @i:=@i + `freq` WHERE `from_id` = 1
# Затронуто 2 строки.

3.

SET @i:=0;# MySQL вернула пустой результат (т.е. ноль строк).


UPDATE `links` SET rng = @i:=@i + `freq` WHERE `from_id` = 1# Затронуто 2 строки.

Записи меняются в соответствии с заданным значением переменной. Все работает.

---------- Добавлено 07.11.2013 в 19:20 ----------

Но это не то - запускай мой пример и наблюдай.

---------- Добавлено 07.11.2013 в 19:21 ----------

Может переменные как-то в одном запросе надо передавать? Так не принимает - ошибку выдает. Вроде как по бутылке в одни руки и не больше.

Дешевые домены для дорвеев и не только - от 55р (https://goo.gl/Wtnwqp)
C
На сайте с 04.02.2005
Offline
291
#23

3. Там АшиПочка

3.

SQL

SET @i:=3;

SQL

UPDATE `links` SET rng = @i:=@i + `freq` WHERE `from_id` = 1

Вроде как по бутылке в одни руки и не больше.

Мне нравится ход твоих мыслей

sidorka
На сайте с 17.08.2012
Offline
211
#24
Chukcha:
3. Там АшиПочка

Все верно работает - мускул не трогает те строки, в которых текущее значение равно передаваемому.

SET @i:=3;# MySQL вернула пустой результат (т.е. ноль строк).

UPDATE `links` SET rng = @i:=@i + `freq` WHERE `from_id` = 1 # MySQL вернула пустой результат (т.е. ноль строк).


---------- Добавлено 07.11.2013 в 20:18 ----------

Ладно, буду считать этот случай фичей мускула. Не забивайте голову ерундой.
siv1987
На сайте с 02.04.2009
Offline
427
#25

$lnks = $db->Query("SELECT from_id FROM links GROUP BY from_id");

if( ! is_array($lnks))
$lnks = array($lnks);

Делать так на "лям" записей не самая удачная идея. С результатом лучше работать на прямую.

Ну и тесты


$res = $db->query('SELECT from_id FROM links GROUP BY from_id');
while($row = $db->fetch($res)){
$db->query('SET @i:=0');
echo 'before: '.current($db->queryAndFetch('SELECT @i'))."\n";

$db->query('UPDATE `links` SET rng = @i:=@i+`freq` WHERE `from_id` = '.$row['from_id']);

echo 'after: '.current($db->queryAndFetch('SELECT @i'));
echo "\n--------------\n";
}


from_id: 1
Before: 0
After: 2
--------------
from_id: 2
Before: 0
After: 80
--------------
from_id: 74
Before: 0
After: 1
--------------


+---------+-------+------+-----+
| from_id | to_id | freq | rng |
+---------+-------+------+-----+
| 1 | 2 | 1 | 1 |
| 1 | 4 | 1 | 2 |
| 2 | 3 | 1 | 1 |
| 2 | 4 | 14 | 15 |
| 2 | 6 | 1 | 16 |
| 2 | 9 | 1 | 17 |
| 2 | 13 | 12 | 29 |
| 2 | 15 | 42 | 71 |
| 2 | 16 | 9 | 80 |
| 74 | 1 | 1 | 1 |
+---------+-------+------+-----+
10 rows in set (0.00 sec)
sidorka
На сайте с 17.08.2012
Offline
211
#26
siv1987:
Ну и тесты

Так а где у меня косяк был? Этот пример повторяет мой по сути, но работает.

1 23

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий