X   Сообщение сайта
(Сообщение закроется через 3 секунды)



 

Здравствуйте, гость ( Вход | Регистрация )

2 страниц V   1 2 >
Открыть тему
Тема закрыта
> Гуру mysql помогите составить запрос.
Hooll
Hooll
Topic Starter сообщение 11.3.2013, 11:54; Ответить: Hooll
Сообщение #1


Участник
***


Группа: User
Сообщений: 128
Регистрация: 25.2.2011
Из: Харьков
Поблагодарили: 9 раз
Репутация:   -12  


Доброго времени суток уважаемые форумчани, нужна помощь в составлении запроса к базе данных mysql.

Вот сам запрос: mysql_query("SELECT * FROM name_base WHERE status_otpravli='1' ORDER BY rand() LIMIT 1");

Нужно его так доработать чтоб он когда выбирал эту одну запись сразу менял в поле status_otpravli значение с 1 на 3.

За ранее спасибо.


--------------------
0
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
oldzas
oldzas
сообщение 11.3.2013, 12:14; Ответить: oldzas
Сообщение #2


Бывалый
****


Группа: Banned
Сообщений: 279
Регистрация: 16.5.2011
Поблагодарили: 25 раз
Репутация:   1  


поставьте просто условие - если что то отправил, тогда UPDATE по уже заранее известному id записи, поля status_otpravli значение с 1 на 3.
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
WarZEN
WarZEN
сообщение 11.3.2013, 14:38; Ответить: WarZEN
Сообщение #3


Участник
***

Группа: User
Сообщений: 121
Регистрация: 10.3.2013
Поблагодарили: 24 раза
Репутация:   6  


Если в ту сторону смотрю, то вам нужно вытянуть значение строки в котором status_otpravli равное '1' и в случае успеха - вытянуть строку в которой status_otpravli равное '3'

$result = mysql_query("SELECT * FROM name_base WHERE status_otpravli='1' ORDER BY rand() LIMIT 1");
$flag = false;
while($row=mysql_fetch_array($result)){
    /* Выполняем определенного рода действия */
    $flag = true;    
}
if ($flag) {
    $result = mysql_query("SELECT * FROM name_base WHERE status_otpravli='3' ORDER BY rand() LIMIT 1");
    while($row=mysql_fetch_array($result)){
        /* Выполняем определенного рода действия */
    }

}


По логике должна схема сработать
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
devuser
devuser
сообщение 11.3.2013, 15:26; Ответить: devuser
Сообщение #4


Все будет тип-топ
*****

Группа: Active User
Сообщений: 713
Регистрация: 5.12.2012
Из: Online
Поблагодарили: 342 раза
Репутация:   52  


WarZEN, зачем эти циклы, флаги, если стоит limit 1 ?

$result = mysql_query("SELECT * FROM name_base WHERE status_otpravli='1' ORDER BY rand() LIMIT 1");
if (mysql_num_rows($result) > 0) {
    $row = mysql_fetch_array($result);
    mysql_query("UPDATE name_base SET status_otpravili = 3 where id = " . $row['id']);
}


UPD
ORDER BY rand() это жесть, конечно. На большом количестве записей убедитесь сами.

Сообщение отредактировал devuser - 11.3.2013, 15:27


--------------------


Поблагодарили: (1)
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
WarZEN
WarZEN
сообщение 11.3.2013, 15:37; Ответить: WarZEN
Сообщение #5


Участник
***

Группа: User
Сообщений: 121
Регистрация: 10.3.2013
Поблагодарили: 24 раза
Репутация:   6  


(devuser @ 11.3.2013, 13:26) *
зачем эти циклы, флаги, если стоит limit 1 ?

Эсли запрос 1 - то да. Написал не обратив внимания на это - но работать все равно будетsmile.gif
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
Hooll
Hooll
Topic Starter сообщение 11.3.2013, 18:31; Ответить: Hooll
Сообщение #6


Участник
***


Группа: User
Сообщений: 128
Регистрация: 25.2.2011
Из: Харьков
Поблагодарили: 9 раз
Репутация:   -12  


(devuser @ 11.3.2013, 14:26) *
$result = mysql_query("SELECT * FROM name_base WHERE status_otpravli='1' ORDER BY rand() LIMIT 1");
if (mysql_num_rows($result) > 0) {
$row = mysql_fetch_array($result);
mysql_query("UPDATE name_base SET status_otpravili = 3 where id = " . $row['id']);
}



Сейчас так и работает, но вариант такой не подходит, нужно именно при выборке менять, а что посоветуете вместо ORDER BY rand(), так как на большом количестве записей тормозит жуть.


--------------------
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
devuser
devuser
сообщение 11.3.2013, 18:39; Ответить: devuser
Сообщение #7


Все будет тип-топ
*****

Группа: Active User
Сообщений: 713
Регистрация: 5.12.2012
Из: Online
Поблагодарили: 342 раза
Репутация:   52  


Hooll, а зачем вам случайное значение?
Выбирайте просто where status_otpravil = 1 - получите первое попавшееся. Вы же потом статус меняете на 3, так что одно и то же получать не будете.

А селект с апдейтом одновременно это дорогое решение, два запроса дешевле. Только индексы обязательно иметь


--------------------
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
Hooll
Hooll
Topic Starter сообщение 11.3.2013, 18:49; Ответить: Hooll
Сообщение #8


Участник
***


Группа: User
Сообщений: 128
Регистрация: 25.2.2011
Из: Харьков
Поблагодарили: 9 раз
Репутация:   -12  


devuser, У меня много поток держит от 30 до 40 потоков открытых, и за счет этого иногда попадают дубликаты, а нужно именно так при выборе менять значения, для того чтоб избавится от этих дубликатов, при том как вы советуете я просто получу 40 одинаковых записей.

Сообщение отредактировал Hooll - 11.3.2013, 18:50


--------------------
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
tszyan
tszyan
сообщение 11.3.2013, 19:24; Ответить: tszyan
Сообщение #9


Участник
***

Группа: User
Сообщений: 207
Регистрация: 28.1.2013
Из: Москва
Поблагодарили: 110 раз
Репутация:   27  


Делайте SELECT ... FOR UPDATE
После этого UPDATE. А дальше работайте с выбранными данными в конкретном потоке.

Повторяться выбранные таким образом данные не будут, но будет происходить кратковременная блокировка (до UPDATE). Если основные временные затраты приходятся на обработку, а не на запросы - то решение хорошее. Если нет - то скорее всего проще было бы обойтись одним потоком. Или читать не по 1 записи, а пачкой.

UPDATE:
И не забудьте отключить autocommit, а то данные не будут блокироваться и попрут дубли.

Сообщение отредактировал tszyan - 11.3.2013, 19:30


Поблагодарили: (1)
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
Pepper
Pepper
сообщение 11.3.2013, 19:24; Ответить: Pepper
Сообщение #10


Бывалый
****

Группа: User
Сообщений: 393
Регистрация: 14.1.2011
Поблагодарили: 123 раза
Репутация:   31  


Первый результат в гугле заслал на такую страницу http://dev.mysql.com/doc/refman/5.1/en/inn...king-reads.html

$result = mysql_query("SELECT * FROM name_base WHERE status_otpravli='1' ORDER BY rand() LIMIT 1 FOR UPDATE");
if($row = mysql_fetch_assoc($result)){
mysql_query("UPDATE name_base SET status_otpravili = 3 where id = " . $row['id']);
}


То есть, при чтении строка блокируйте до апдейта и другие юзеры не смогут ее прочесть.

Дисклеймер: код не тестил ph34r.gif

Сообщение отредактировал Pepper - 11.3.2013, 19:26


Поблагодарили: (1)
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
2 страниц V   1 2 >
Открыть тему
Тема закрыта
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0


Свернуть

> Похожие темы

  Тема Ответов Автор Просмотров Последний ответ
Открытая тема (нет новых ответов) Недорогие услуги - php/js/mysql/jquery/bootstrap
2 vlads 651 13.12.2017, 21:01
автор: vlads
Открытая тема (нет новых ответов) Помогите выбрать программу
Помогите выбрать программу
11 impak 1341 11.12.2017, 13:11
автор: Mikki
Открытая тема (нет новых ответов) Помогите найти плагин на WP
Отзывы с профилей соц сетей
1 SEOMR 440 30.11.2017, 7:18
автор: Nell
Открытая тема (нет новых ответов) Помогите найти проблему
Долгий ответ сервера
6 maxim1249 692 29.11.2017, 17:27
автор: genjnat
Открытая тема (нет новых ответов) Помогите оценить новотник. Плиз
1 Alex-777 524 29.11.2017, 7:18
автор: grumdas


 



RSS Текстовая версия Сейчас: 15.12.2017, 5:02
Дизайн