Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Update и сортировка / 11 сообщений из 11, страница 1 из 1
08.11.2013, 02:35:27
    #38457239
oboldei
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Update и сортировка
Суть такова. Допустим есть таблица 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
08.11.2013, 05:30:21
    #38457294
tanglir
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Update и сортировка
...
Рейтинг: 0 / 0
08.11.2013, 15:26:47
    #38458075
oboldei
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Update и сортировка
tanglir,
Не совсем то... Инфа по ссылки пригодится если самому сформировать значения, для каждой строчки.
А я пытаюсь сделать так, что бы обновив id 15 и сделав у него reit = 1. Послать запрос, который пересчитает и обновит все значения рейтинга. Там где было 1 сделает 2, где было 2 сделает 3.

Не знаю, возможно ли так сделать вообще....
...
Рейтинг: 0 / 0
08.11.2013, 16:05:22
    #38458128
qwerty112
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Update и сортировка
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
08.11.2013, 17:12:47
    #38458234
oboldei
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Update и сортировка
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
08.11.2013, 18:23:13
    #38458318
Arhat109
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Update и сортировка
oboldei,

Скорее всего. Попробуйте сначала математически строго сформулировать задачу и вопрос. Возможно он к тому времени и решится. :)
...
Рейтинг: 0 / 0
08.11.2013, 18:23:15
    #38458319
qwerty112
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Update и сортировка
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
08.11.2013, 21:56:28
    #38458475
oboldei
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Update и сортировка
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
08.11.2013, 22:02:04
    #38458478
oboldei
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Update и сортировка
oboldei,
авторчто, например, должно произойти с reit того id, у которого reit =2 (id=1), на момент ДО выполнения запроса ?

В том то и дело что нечего. Получается что на данный момент id=1 имеет reit=1. То означает первую позицию в ТОП. А присваивая id=15 reit=2 я меняю значения начиная со второй позиции ТОП.
...
Рейтинг: 0 / 0
09.11.2013, 01:06:18
    #38458564
oboldei
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Update и сортировка
Реализовал, задачу с помощью 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
09.11.2013, 15:35:15
    #38458773
tanglir
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Update и сортировка
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
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Update и сортировка / 11 сообщений из 11, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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