Помощник
|
Гуру mysql помогите составить запрос. |
Hooll
|
Сообщение
#1
|
||
|
|
||
|
|||
oldzas |
11.3.2013, 12:14;
Ответить: oldzas
Сообщение
#2
|
|
поставьте просто условие - если что то отправил, тогда UPDATE по уже заранее известному id записи, поля status_otpravli значение с 1 на 3.
|
|
|
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 |
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 |
11.3.2013, 15:37;
Ответить: WarZEN
Сообщение
#5
|
|
|
|
|
Hooll
|
Сообщение
#6
|
|
$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 |
11.3.2013, 18:39;
Ответить: devuser
Сообщение
#7
|
|
Hooll, а зачем вам случайное значение?
Выбирайте просто where status_otpravil = 1 - получите первое попавшееся. Вы же потом статус меняете на 3, так что одно и то же получать не будете. А селект с апдейтом одновременно это дорогое решение, два запроса дешевле. Только индексы обязательно иметь -------------------- |
|
|
Hooll
|
Сообщение
#8
|
|
devuser, У меня много поток держит от 30 до 40 потоков открытых, и за счет этого иногда попадают дубликаты, а нужно именно так при выборе менять значения, для того чтоб избавится от этих дубликатов, при том как вы советуете я просто получу 40 одинаковых записей.
Сообщение отредактировал Hooll - 11.3.2013, 18:50 -------------------- |
|
|
tszyan |
11.3.2013, 19:24;
Ответить: tszyan
Сообщение
#9
|
|
Делайте SELECT ... FOR UPDATE
После этого UPDATE. А дальше работайте с выбранными данными в конкретном потоке. Повторяться выбранные таким образом данные не будут, но будет происходить кратковременная блокировка (до UPDATE). Если основные временные затраты приходятся на обработку, а не на запросы - то решение хорошее. Если нет - то скорее всего проще было бы обойтись одним потоком. Или читать не по 1 записи, а пачкой. UPDATE: И не забудьте отключить autocommit, а то данные не будут блокироваться и попрут дубли. Сообщение отредактировал tszyan - 11.3.2013, 19:30 |
|
|
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']); } То есть, при чтении строка блокируйте до апдейта и другие юзеры не смогут ее прочесть. Дисклеймер: код не тестил Сообщение отредактировал Pepper - 11.3.2013, 19:26 |
|
|
|
Похожие темы
Тема | Ответов | Автор | Просмотров | Последний ответ | |
---|---|---|---|---|---|
Запрос на бесплатные полезности | 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 |
Текстовая версия | Сейчас: 23.4.2024, 20:59 |