powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / MySQL [игнор отключен] [закрыт для гостей] / UPDATE + JOIN + ORDER BY в одном запросе
6 сообщений из 6, страница 1 из 1
UPDATE + JOIN + ORDER BY в одном запросе
    #39266904
comalex3
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Продолжение темы

Есть таблица dsl_checkins и area_distance . В area_distance 3 поля :

Код: sql
1.
2.
3.
distance
area1
area2


Для примера:

Код: sql
1.
2.
3.
distance = 3456
area1 = phoenix
area2 = houston



Мне нужно получить с dsl_checkins запись где distance самая маленькая и нужно заботиться о usage_flag поле(дабы небыли гонок). Думал сделать красиво одним запросом:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
UPDATE dsl_checkins DC
    join area_distance AD
    on AD.area2 = DC.area
set DC.usage_flag=1,
    DC.id = (SELECT @dsl_id := DC.id)
WHERE DC.active = 1 AND
      DC.offline = 0 AND
      usage_flag = 0 AND
      AD.area1 = 'houston'
ORDER BY AD.distance ASC, RAND()
limit 1;



Но получаю ошибку

Код: plaintext
Error Code: 1221. Incorrect usage of UPDATE and ORDER BY

На стековерфлов дали ссылку на документацию что так делать нельзя, и дают
ссылку .

Но вот как это:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
UPDATE Ratemaster
SET Ratemaster.Rate =
(
    SELECT Rates.Rate
    FROM Rates
    WHERE Ratemaster.user = Rates.user
    ORDER BY Rates.id
    LIMIT 1
)



применить к моему запросу не понимаю.

Есть идеи?
ПС: чувствую что не правильно все делаю но нет идей. Спасибо.
...
Рейтинг: 0 / 0
UPDATE + JOIN + ORDER BY в одном запросе
    #39267086
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
как оно у вас вообще работает, не пойму...
есть ДЦ, она связана с АД только по ареа-коду, так? а если там и тут по две записи с одной ареей, то джойн выдаст четыре пары, верно? и тогда вот этот запрос - он какую запись из ДЦ должен проапдейтить - ведь запись с минимальной дистанцией в АД будет относиться сразу к обеим записям из ДЦ?.. может, в условии связи ещё что-то есть/должно быть? или задача так и стоит - "найти и проапдейтить одну случайную запись, относящуюся к минимальной дистанции?"
...
Рейтинг: 0 / 0
UPDATE + JOIN + ORDER BY в одном запросе
    #39267105
Фотография Alex_Ustinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
comalex3,

вы что хотите апдейтить в dsl_checkins

только DC.usage_flag=1 ??? чем и при каких условиях
а вот это что
DC.id = (SELECT @dsl_id := DC.id)
нормально объясните
...
Рейтинг: 0 / 0
UPDATE + JOIN + ORDER BY в одном запросе
    #39267178
comalex3
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Alex_Ustinov,
Зачем нужно:
Код: sql
1.
(SELECT @dsl_id := DC.id)




Сделали update : для таблицы dsl_checkins с id @dsl_id поставили usage_flag = 1(пока я не освобожу это поле никто не сможет использовать его).
Дальше в скрипте получаем информацию про запись с таблицы dsl_checkins где id равно @dsl_id

Код: sql
1.
SELECT * FROM dsl_checkins WHERE id = (SELECT @dsl_id) 
...
Рейтинг: 0 / 0
UPDATE + JOIN + ORDER BY в одном запросе
    #39267205
comalex3
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
tanglir,

- "найти и проапдейтить одну случайную запись, относящуюся к минимальной дистанции?"

Так и есть.

area_distance
Код: sql
1.
2.
3.
4.
5.
id   area1          area2            distance       
1    houston      phoenix         1235.345
2    dallas         phoenix         32432.453
3    newyourk   atlanta           32432.453
...




dsl_checkins

Код: sql
1.
2.
3.
4.
5.
6.
7.
id   area        active        usage_flag ....       
1    houston      1                  0
3    houston      1                  0
4    houston      0                  1
5    dallas       0                  0
...
...



Нужно получить одну запись dsl_checkins, но отсортировать ее по дистанции с area_distance где dsl_checkins.area2 = area_distance.area. Получаеться в dsl_checkins может быть не одно запись соответствующая критериям для это мы делаем

Код: sql
1.
2.
ORDER BY AD.distance ASC, RAND()
limit 1;
...
Рейтинг: 0 / 0
UPDATE + JOIN + ORDER BY в одном запросе
    #39268494
Фотография Alex_Ustinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
comalex3,

1. найти id случайной записи (SELECT .... ORDER BY AD.distance ASC, RAND() limit 1)
2. UPDATE .... WHERE id= (id случайной записи)
как бы ни было громоздко, должно работать
это и есть решение упомянутое выше
UPDATE Ratemaster
SET Ratemaster.Rate =
(
SELECT Rates.Rate
FROM Rates
WHERE Ratemaster.user = Rates.user
ORDER BY Rates.id
LIMIT 1
)
...
Рейтинг: 0 / 0
6 сообщений из 6, страница 1 из 1
Форумы / MySQL [игнор отключен] [закрыт для гостей] / UPDATE + JOIN + ORDER BY в одном запросе
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]