Форум администраторов игровых серверов

Форум администраторов игровых серверов (https://forum.zone-game.info/TT.php)
-   PHP (https://forum.zone-game.info/forumdisplay.php?f=125)
-   -   Помогите написать запрос (https://forum.zone-game.info/showthread.php?t=16244)

Gambit_J 09.10.2011 19:26

Помогите написать запрос
 
Дана таблица character_subclasses:

http://www.pictureshack.ru/images/392855.PNG

Итак смотрим на последнюю колонку "class_index" - здесь идут саб-класы по порядку у одного чара.

Что мне нужно сделать?
Необходимо все единцы("1") в колонки class_index, у повторяющихся charId установить на "+1...". Как сделать такой запрос? Весь день голову уже ломаю)

L2CCCP 09.10.2011 19:43

Re: Помогите написать запрос
 
Думаю легче было за пол дня переписать в ручную.

Place 09.10.2011 19:53

Re: Помогите написать запрос
 
тут одним запросом не обойдется :D

в раздел рынок
быстрее и проще

или http://rutracker.org/forum/viewtopic.php?t=3709220
часть 2 - основы работы с базой
4 и 6 пункт

там как раз в примере циклы

Gambit_J 09.10.2011 20:24

Re: Помогите написать запрос
 
L2CCCP, хех, а если 5к+ записей? Как ты себе это представляеш(сверка)? :)


Place, Ну я так примерно и предпологал, что без цикла ни как(( Просто думал. мало ли мож чето незнаю)

DreamCast 09.10.2011 20:34

Re: Помогите написать запрос
 
чет типа того

$all = mysql_num_rows(mysql_query("SELECT class_idexp FROM character_subclasses WHERE charid=1111"));
$i = 1;

while ($i <= $all) {
mysql_query('UPDATE character_subclasses SET class_index = $i WHERE charid=111 AND class_index=1');
}

Gambit_J 09.10.2011 20:37

Re: Помогите написать запрос
 
Цитата:

Сообщение от DreamCast (Сообщение 142633)
чет типа того

$all = mysql_num_rows(mysql_query("SELECT class_idexp FROM character_subclasses WHERE charid=1111"));
$i = 1;

while ($i <= $all) {
mysql_query('UPDATE character_subclasses SET class_index = $i WHERE charid=111 AND class_index=1');
}

Проблема в том, что чар не один) Попробуй твой запрос селект развернуть в цикл и задать все это в массив для вхиле. Сообщу об успехах. Спасибо за подсказку. :)

DreamCast 09.10.2011 20:38

Re: Помогите написать запрос
 
на самом деле можно сделать и средствами SQL.
например многосоставный запрос или переменные в sql.

Добавлено через 55 секунд
Цитата:

Сообщение от php_mysql (Сообщение 142634)
Проблема в том, что чар не один) Попробуй твой запрос селект развернуть в цикл и задать все это в массив для вхиле. Сообщу об успехах. Спасибо за подсказку. :)

в задании про множество чаров инфы не было)

Gambit_J 09.10.2011 20:43

Re: Помогите написать запрос
 
Цитата:

Сообщение от DreamCast (Сообщение 142635)
в задании про множество чаров инфы не было)

Тада я бы пошел по стопам 2 поста в теме :D )))

Цитата:

Сообщение от DreamCast (Сообщение 142635)
на самом деле можно сделать и средствами SQL.
например многосоставный запрос или переменные в sql.

Добавлено через 55 секунд

да я тоже так думал, но все же учитываю множественность чаром без цикла кажись не обойдеться. В любом случае придеться записывать все в массивы, а тут тока цикл выполнит их полность.

DreamCast 09.10.2011 20:52

Re: Помогите написать запрос
 
нет возможности проверить, возможно, так будет работать тоже:
UPDATE character_subclasses SET class_index=(class_index+1)
WHERE charid=111
AND class_index=1
AND class_idexp=(SELECT class_idexp FROM character_subclasses WHERE charid=1111);

Добавлено через 2 минуты
точнее так)
UPDATE character_subclasses SET class_index=(SELECT MAX(class_index) FROM character_subclasses WHERE charid=1111)+1
WHERE charid=111
AND class_index=1
AND class_idexp=(SELECT class_idexp FROM character_subclasses WHERE charid=1111);

Gambit_J 09.10.2011 20:58

Re: Помогите написать запрос
 
У меня наплыв идей проихошел)) ща делаю)

DreamCast 09.10.2011 20:59

Re: Помогите написать запрос
 
результатом заделись - интересно, что выйдет в итоге.

Gambit_J 09.10.2011 21:20

Re: Помогите написать запрос
 
Цитата:

Сообщение от DreamCast (Сообщение 142643)
нет возможности проверить, возможно, так будет работать тоже:
UPDATE character_subclasses SET class_index=(class_index+1)
WHERE charid=111
AND class_index=1
AND class_idexp=(SELECT class_idexp FROM character_subclasses WHERE charid=1111);

Добавлено через 2 минуты
точнее так)
UPDATE character_subclasses SET class_index=(SELECT MAX(class_index) FROM character_subclasses WHERE charid=1111)+1
WHERE charid=111
AND class_index=1
AND class_idexp=(SELECT class_idexp FROM character_subclasses WHERE charid=1111);

You can't specify target table 'character_subclasses' for update in FROM clause

Добавлено через 30 секунд
Цитата:

Сообщение от DreamCast (Сообщение 142647)
результатом заделись - интересно, что выйдет в итоге.

Естественно)) Пока додумываю свой метод.

NotSpecified 10.10.2011 01:35

Re: Помогите написать запрос
 
По поводу You can't specify target table все верно ибо запрос составлен неправильно. Нельзя в одном запросе читать и изменять значения в одной таблице. Коллизия происходит и в итоге получаете эту ошибку.

Azagthtot 10.10.2011 09:19

Re: Помогите написать запрос
 
Простите, а написать не ЗАПРОС а SQL скрипт с использованием курсоров вам что-то мешает?
- создаете временную табличку для ИД
- делаете селект в курсор
- итерируете курсор, если находите запись подходящую под условия изменения, то заносите ее во временную таблицу
- делаете апдейт по основной таблице и временной

Gambit_J 10.10.2011 12:10

Re: Помогите написать запрос
 
Цитата:

Сообщение от Azagthtot (Сообщение 142686)
Простите, а написать не ЗАПРОС а SQL скрипт с использованием курсоров вам что-то мешает?
- создаете временную табличку для ИД
- делаете селект в курсор
- итерируете курсор, если находите запись подходящую под условия изменения, то заносите ее во временную таблицу
- делаете апдейт по основной таблице и временной

Курсор я так понимаю это типо mysql_result($запрос, 0, 1) ?

Я вчера ночью так и сделал все, но проблема в сортировки. Все ставиться ни там где надо, мускул произвольно вывод делает,а не по порядку записей. Но сегодня с сортировкой сделаю, добавлю столбец по ИД, посмарю что получиться.

Добавлено через 8 минут
Если оставить лишь 3 записи с одинаковыми обж_ид, а ост удалить, то все верно расставляеться. Вобщем буду сортировку ставить)

Azagthtot 10.10.2011 12:26

Re: Помогите написать запрос
 
курсор - это
DECLARE cur1 CURSOR FOR SELECT .... FROM zz;

Gambit_J 10.10.2011 12:31

Re: Помогите написать запрос
 
Цитата:

Сообщение от Azagthtot (Сообщение 142742)
курсор - это
DECLARE cur1 CURSOR FOR SELECT .... FROM zz;

Спасибо, такой первый раз вижу, так как на стадии учения :) Буду пробывать.

Добавлено через 1 час 17 минут
Примерно понял для чего нужен ДЕКЛАР, но до конца не могу вьехать как сделать то, что мне надо. Ни где нет нормального объяснения как правельно составить этот SQL скрипт (синтаксис). :( Если не сложно н аживом примере покажи пожалуйста.

Добавлено через 4 часа 14 минут
Всем спасибо кто помогал, короче сделал так:

PHP код:

//макс кол-во выполнения цикла (от кол-во записей)
$max_char mysql_query("SELECT COUNT(*) FROM character_subclasses");
$Rmax_char mysql_result($max_char0);

//изымаем чар_ид фулл
$char_main mysql_query("SELECT charId FROM character_subclasses ORDER BY id");

//создаем цикл выполнения обновлений
for ($i 0$i <= $Rmax_char-1$i++) {
$chars mysql_query("SELECT class_id FROM character_subclasses WHERE charId='".@mysql_result($char_main$i)."'");
mysql_query("UPDATE character_subclasses SET class_index='1' WHERE charId='".@mysql_result($char_main$i)."' AND class_id='".@mysql_result($chars00)."'");
mysql_query("UPDATE character_subclasses SET class_index='2' WHERE charId='".@mysql_result($char_main$i)."' AND class_id='".@mysql_result($chars10)."'");
mysql_query("UPDATE character_subclasses SET class_index='3' WHERE charId='".@mysql_result($char_main$i)."' AND class_id='".@mysql_result($chars20)."'");




Текущее время: 02:19. Часовой пояс GMT +3.

Powered by vBulletin® Version 3.8.6
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot