Помощь в формировании запроса MySQL

ibred

Client
Регистрация
04.04.2015
Сообщения
3 835
Благодарностей
3 552
Баллы
113
Есть таблица со структурой:
2017-01-03_19-59-59.png

Что нужно:
Необходимо взять значения data и key в количестве 1 шт.
И для строки, откуда мы взяли эти значения, обновить ячейку active до 1 (по-умолчанию там 0), чтобы при следующем обращении не бралась эта же строка.

Что есть:
Запрос на получение значений:
Код:
SELECT data,key
FROM threads
WHERE key2 IS NULL AND time IS NULL AND active=0
LIMIT 1
Но как добавить в этот же запрос обновление ячейки, не могу сообразить. Не хватает знаний. Может кто-то помочь?
 

tka4enko.ilya

Client
Регистрация
20.10.2015
Сообщения
61
Благодарностей
9
Баллы
8
вторым запросом, в условии подставить ID
 
  • Спасибо
Реакции: doc

doc

Client
Регистрация
30.03.2012
Сообщения
8 684
Благодарностей
4 641
Баллы
113
id тоже бери селектом. 2м запросом апдейтом меняй по условию where id=наш_айди
 

ibred

Client
Регистрация
04.04.2015
Сообщения
3 835
Благодарностей
3 552
Баллы
113

IgorSush

Client
Регистрация
11.02.2016
Сообщения
312
Благодарностей
108
Баллы
43
  1. SELECT data,key
  2. FROM threads
  3. WHERE key2 IS NULL AND time IS NULL AND active=0
  4. LIMIT 1
После этого, получив данные в переменные $data $key делаем вторым запросом:
UPDATE threads SET acitve=1
WHERE data=$data AND key=$key


Если работоаете с многопотоком: засада, если потоки открываются пачками( а так чаще всего и бывает), несколько потоков успевают взять одну и ту же запись, т.к. обновление active = 1 происходит чуть позже.

Для этого посоветую сначала делать UPDATE, а потом SELECT
 

ibred

Client
Регистрация
04.04.2015
Сообщения
3 835
Благодарностей
3 552
Баллы
113
После этого, получив данные в переменные $data $key делаем вторым запросом:
UPDATE threads SET acitve=1
WHERE data=$data AND key=$key


Если работоаете с многопотоком: засада, если потоки открываются пачками( а так чаще всего и бывает), несколько потоков успевают взять одну и ту же запись, т.к. обновление active = 1 происходит чуть позже.

Для этого посоветую сначала делать UPDATE, а потом SELECT
Косяк в том, что data и key заранее неизвестны, то есть они тянутся из таблицы.
Как мне сделать правильно UPDATE? Допустим я сделал обновление первого значения, после делаю SELECT по active=1, но ведь тогда все потоки будут брать одну и ту же строку.
Или как мне сделать UPDATE строки так, чтобы ответом получить data и key строки для которой произошло обновление?
 

doc

Client
Регистрация
30.03.2012
Сообщения
8 684
Благодарностей
4 641
Баллы
113
ты берешь поля

SELECT data,key,ID
FROM threads
WHERE key2 IS NULL AND time IS NULL AND active=0
LIMIT 1

не знаю, как реализована работа с бз в зеннопостере. Полагаю, что у тебя будут 3 переменные, в одной из которых буде значение поля ID

вторым запросом ты обновляешь запись по айдишнику. что-то типа
UPDATE threads SET acitve=1
WHERE ID=переменная_с_ID

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

ibred

Client
Регистрация
04.04.2015
Сообщения
3 835
Благодарностей
3 552
Баллы
113
но как залокать эти 2 запроса средствами работы с бд, чтобы в других потоках не велась работа с 1й и той же записью, я не знаю
Мне вот как раз для многопотока и нужно.
 

IgorSush

Client
Регистрация
11.02.2016
Сообщения
312
Благодарностей
108
Баллы
43
Косяк в том, что data и key заранее неизвестны, то есть они тянутся из таблицы.
Как мне сделать правильно UPDATE? Допустим я сделал обновление первого значения, после делаю SELECT по active=1, но ведь тогда все потоки будут брать одну и ту же строку.
Или как мне сделать UPDATE строки так, чтобы ответом получить data и key строки для которой произошло обновление?
Одним запросом это вряд ли получится.

Я это реализую так: В таблице есть поле, например status, оно по умолчанию NULL
Когда надо получить запись, я в шаблоне генерирую случайное число $random(0-1000000, например)
Делаю
UPDATE threads SET status=$random, active=1 WHERE status IS NULL AND key2 IS NULL AND time IS NULL AND active=0 LIMIT 1
Дальше просто
SELECT data,key FROM threads WHERE status=$random

По окончании работы с записью не забываем снова обнулять статус
UPDATE threads SET status=NULL WHERE status=$random
 
  • Спасибо
Реакции: SilverSun, ibred и Chick80

ibred

Client
Регистрация
04.04.2015
Сообщения
3 835
Благодарностей
3 552
Баллы
113
Одним запросом это вряд ли получится.

Я это реализую так: В таблице есть поле, например status, оно по умолчанию NULL
Когда надо получить запись, я в шаблоне генерирую случайное число $random(0-1000000, например)
Делаю
UPDATE threads SET status=$random, active=1 WHERE status IS NULL AND key2 IS NULL AND time IS NULL AND active=0 LIMIT 1
Дальше просто
SELECT data,key FROM threads WHERE status=$random

По окончании работы с записью не забываем снова обнулять статус
UPDATE threads SET status=NULL WHERE status=$random
Отлично подходит, благодарю!
 

Кто просматривает тему: (Всего: 1, Пользователи: 0, Гости: 1)