powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Update и сортировка
11 сообщений из 11, страница 1 из 1
Update и сортировка
    #38457239
oboldei
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Суть такова. Допустим есть таблица tab1 с полями ( id , reit );
id - primary key;
reit - int not null.

Заполнены они так:
-------------
id | reit |
-------------
1 | 1 |
12 | 2 |
13 | 3 |
15 | 4 |
-------------

Вопрос. Как за один запрос сделать вот так? :
-------------
id | reit |
-------------
1 | 2 |
12 | 3 |
13 | 1 |
15 | 4 |
-------------
Рейтинг я меняю по своему усмотрению. Следующий раз могу id 15 сделать 1. И тогда снова надо всё перестроить.
Представляю как это можно сделать, если получить все строки массивом и обработать их, а дальше сформировать огромный Update, с правильно заполненными полями. Но я чувствую это извращение ещё то... У кого какие мысли есть? Как провернуть этот номер используя только MySQL?
...
Рейтинг: 0 / 0
Update и сортировка
    #38457294
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Update и сортировка
    #38458075
oboldei
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
tanglir,
Не совсем то... Инфа по ссылки пригодится если самому сформировать значения, для каждой строчки.
А я пытаюсь сделать так, что бы обновив id 15 и сделав у него reit = 1. Послать запрос, который пересчитает и обновит все значения рейтинга. Там где было 1 сделает 2, где было 2 сделает 3.

Не знаю, возможно ли так сделать вообще....
...
Рейтинг: 0 / 0
Update и сортировка
    #38458128
qwerty112
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
oboldeitanglir,
Не совсем то... Инфа по ссылки пригодится если самому сформировать значения, для каждой строчки.
А я пытаюсь сделать так, что бы обновив id 15 и сделав у него reit = 1. Послать запрос, который пересчитает и обновит все значения рейтинга. Там где было 1 сделает 2, где было 2 сделает 3 .

Не знаю, возможно ли так сделать вообще....
таа, г.-вопрос
Код: sql
1.
set reit = case when id=15 then 1 else reit+1 end
...
Рейтинг: 0 / 0
Update и сортировка
    #38458234
oboldei
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
qwerty112, На первый взгляд это может сработать, но это не так. Получается ерунда((( reit будет повторяется. А если несколько раз выполнить подобный запрос. То число в reit будет больше чем строк в таблице, а это не подходит.

Допустим есть всё та же таблица:
-------------
id | reit |
-------------
1 | 1 |
12 | 2 |
13 | 3 |
15 | 4 |
------------

Выполним запрос и получим (для наглядности отсортирую по полю reit):
-------------
id | reit |
-------------
15 | 1 |
1 | 2 |
12 | 3 |
13 | 4 |
------------
Казалось бы идеально. Но...

Если id=15 reit = 2
-------------
id | reit |
-------------
1 | 2 |
15 | 2 |
12 | 3 |
13 | 4 |
------------

То же самое если попытаться увеличить рейтниг, сделать reit=3 для id= 12.
-------------
id | reit |
-------------
1 | 2 |
12 | 3 |
13 | 4 |
15 | 5 |
------------

З.Ы. Наверно тему нужно было назвать "Update нескольких строк с условием" сглупил((.
...
Рейтинг: 0 / 0
Update и сортировка
    #38458318
Arhat109
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
oboldei,

Скорее всего. Попробуйте сначала математически строго сформулировать задачу и вопрос. Возможно он к тому времени и решится. :)
...
Рейтинг: 0 / 0
Update и сортировка
    #38458319
qwerty112
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
oboldeiКазалось бы идеально. Но...

Если id=15 reit = 2
-------------
id | reit |
-------------
1 | 2 |
15 | 2 |
12 | 3 |
13 | 4 |
------------
нее, ТС, так "кина не будет"

если это
авторобновив id 15 и сделав у него reit = 1. Послать запрос, который пересчитает и обновит все значения рейтинга. Там где было 1 сделает 2, где было 2 сделает 3.

на этих данных
Код: sql
1.
2.
3.
4.
5.
6.
7.
id | reit |
-------------
1 | 2 | 
12 | 3 |
13 | 1 |
15 | 4 |
-------------


я "переосмыслить творчески" могу, - (ТЗ:циклически сдвинуть рейтинг у всех id)

то, что такое "Если id=15 reit = 2" - не понимат !
что, например, должно произойти с reit того id, у которого reit =2 (id=1), на момент ДО выполнения запроса ?
...
Рейтинг: 0 / 0
Update и сортировка
    #38458475
oboldei
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
qwerty112,

Вы не так поняли. Если выполнить запрос:
Код: plsql
1.
set reit = case when id=15 then 2 else reit+1 end


На таблице, заполненной следующим образом.
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
-------------
id | reit |
-------------
1 | 1 |
12 | 2 |
13 | 3 |
15 | 4 |
------------


То получим:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
-------------
id | reit |
-------------
1 | 2 |
15 | 2 |
12 | 3 |
13 | 4 |
------------



авторя "переосмыслить творчески" могу, - (ТЗ:циклически сдвинуть рейтинг у всех id)
Не совсем так. Если формировать ТЗ, то оно будет звучать примерно так:
1. Поле reit должно быть уникальным.
2. Значение в поле reit всегда от 0 до count(id)-1. Хотя в примерах выше я нумеровал с 1. Реально же она будет с 0.
3. Изменение reit будут также в диапазоне от 0 до count(id)-1. То есть reit с id=15 может быть присвоено любое значение не превышающие count(id)-1;
4. Циклически сдвинуть рейтинг при изменении значения. С учётом пунктов 1-3.

Получается некий ТОП. Первая позиция которого reit=0. Вторая позиция которого reit=1. И когда изменяется reit, меняется позиция в топе.

З.Ы. Вывел закономерность. Реально нужно менять все строки где new_reit>=reit. Строк где (new_reit<reit). изменения не коснутся.
...
Рейтинг: 0 / 0
Update и сортировка
    #38458478
oboldei
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
oboldei,
авторчто, например, должно произойти с reit того id, у которого reit =2 (id=1), на момент ДО выполнения запроса ?

В том то и дело что нечего. Получается что на данный момент id=1 имеет reit=1. То означает первую позицию в ТОП. А присваивая id=15 reit=2 я меняю значения начиная со второй позиции ТОП.
...
Рейтинг: 0 / 0
Update и сортировка
    #38458564
oboldei
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Реализовал, задачу с помощью PHP. Хотелось бы привести ещё к виду:
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
 if (isset($_POST['new_rait'])) { 
 foreach ($reit as $re)
 {  //Проверяем, новое значачениее рейтинга, больше текушего, если мень, то юзаем другой запрос.
	if ($_POST['new_rait']>$_POST['tekushi_rait']) 
	{
		//Запрос если значение rait поВИШИно	
	} 
	elseif ($_POST['new_rait']<$_POST['tekushi_rait']) 
	{
		//Запрос если значение rait поНИЖЕно
	};
 };



Но сейчас задача реализована так:
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
 if (isset($_POST['new_rait'])) { //Получая масив, первый элемент которого содержит rait=0 второй rait=1
 $reit = $db->query("SELECT id,rait FROM tab1 WHERE ORDER BY rait")->fetchAll(PDO::FETCH_ASSOC);
 $UPDATE = 'UPDATE tab1 SET rait = CASE'; //Начинаем подготавливать запрос
 $line = '';
 $kol = 0;
 foreach ($reit as $re)
 {  //Проверяем, новое значачениее рейтинга, больше текушего, если мень, то юзаем другой алгоритм.
	if ($_POST['new_rait']>$_POST['tekushi_rait']) 
	{
		if ($_POST['new_rait']==$re['rait']) 
		{
			$line .= $re['id'];
			$UPDATE .= " WHEN id = '".$re['id']."' THEN '".$kol."' END WHERE id IN (".$line.");";
			break;
		}
		elseif ($re['id']==$_POST['id']) 
		{
			$UPDATE .= " WHEN id = '".$re['id']."' THEN '".$_POST['new_rait']."'";
			$line .= $re['id'].',';
			--$kol; //Уменьшаем, так как в этот раз мы его не используем
		}
		elseif ($_POST['new_rait']>=$re['rait']) 
		{
			$UPDATE .= " WHEN id = '".$re['id']."' THEN '".$kol."'";
			$line .= $re['id'].',';
		}
		++$kol;
	} elseif ($_POST['new_rait']<$_POST['tekushi_rait']) 
	{
		//id в таблице, id которое меняем, дальше крутить нет смысла.
		if ($re['id']==$_POST['id'])
		{
			$line .= $re['id'];
			$UPDATE .= " WHEN id = '".$re['id']."' THEN '".$_POST['new_rait']."' END WHERE id IN (".$line.");";
			break;
		}
		//Начинаем менять значения когда рейтинг таблицы стаёт больше нового, до этого нет смысла, те же значения.
		if ($re['rait']>=$_POST['new_rait']) 
		{
			$UPDATE .= " WHEN id = '".$re['id']."' THEN '".($re['rait']+1)."'";
			$line .= $re['id'].',';
		}
	};
 };
 echo $UPDATE;
 if ($_POST['reit']<>$_POST['rait']) 
	$db->query($UPDATE)->fetchAll(PDO::FETCH_ASSOC);
};



Уважаемые гуру MySQL. У кого есть идеи, как эти условия выполнить в запросе на обновление?
...
Рейтинг: 0 / 0
Update и сортировка
    #38458773
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
oboldeiнужно менять все строки где new_reit>=reit. Строк где (new_reit<reit). изменения не коснутся.А протестирую-ка я новую прошивку своего ХШ
Код: sql
1.
2.
update tablicco
set reit=if(id=:myid,:myrate,if(reit>=:myrate,reit+1,reit))
...
Рейтинг: 0 / 0
11 сообщений из 11, страница 1 из 1
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Update и сортировка
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]