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



 

Здравствуйте, гость (

| Вход | Регистрация )

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


Доброго времени суток уважаемые форумчани, нужна помощь в составлении запроса к базе данных 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


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


Если в ту сторону смотрю, то вам нужно вытянуть значение строки в котором 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


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


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

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


(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


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

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


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


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

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


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


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

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

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

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


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


Первый результат в гугле заслал на такую страницу 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 >
Открыть тему
Тема закрыта
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0


Свернуть

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

  Тема Ответов Автор Просмотров Последний ответ
Открытая тема (нет новых ответов) Запрос на бесплатные полезности
7 Tia2 1973 23.3.2024, 11:27
автор: Alexand3r
Открытая тема (нет новых ответов) Как составить уравнение, чтобы назначить цену для товара?
2 rownong27 761 21.3.2024, 12:53
автор: Lumex
Открытая тема (нет новых ответов) Помогите вспомнить рекламного бота Телеграм для обмена рекламой
0 Mixatraider 728 21.2.2024, 23:42
автор: Mixatraider
Открытая тема (нет новых ответов) Услуги по созданию и доработке скриптов PHP, MySQL, JavaScript, jQuery
Разработка сайтов и сервисов под-ключ
0 alexey 1243 24.11.2023, 14:46
автор: alexey
Открытая тема (нет новых ответов) Помогите рещить проблему с монитором.
Почему низкое разрешение при подключении монитора через displayport?
0 Levels 1702 11.12.2020, 0:48
автор: Levels


 



RSS Текстовая версия Сейчас: 23.4.2024, 20:59
Дизайн