SQL запрос. Проблема при обработке.

B
На сайте с 21.12.2009
Offline
28
530

Добрый день.

Есть выборка

SELECT stats.counter, profileskeys.id

FROM stats
LEFT JOIN profileskeys ON stats.keyword = profileskeys.keyname
WHERE profileskeys.id IS NOT NULL
ORDER BY stats.counter DESC , stats.keyword ASC

возвращает такие данные

counter    id 

1715 90958
11 91349
8 70074
8 90624
5 65659

Как сделать запрос UPDATE чтобы присвоить значения stats.counter в profileskeys.counter исходя из возвращаемых profileskeys.id

В моем понимании сделать это одним запросом нельзя, так как надо селектить и апдейтить одновременно одну и туже таблицу.

Поэтому хочется уложиться в 2-3 запроса негромоздких(Возможно с созданием временной таблицы), так как не хочется забрасывать мускул запросами обновляя каждую строку результата новым запросом.

Адский Кодер Разработка и аудит безопасности сайтов/скриптов(PHP+MySQL) (/ru/forum/530575)
maldivec
На сайте с 04.11.2008
Offline
160
#1


UPDATE profileskeys SET profileskeys.counter = (
SELECT stats.counter FROM stats
WHERE stats.keyword = profileskeys.keyname
LIMIT 1
)
WHERE profileskeys.id IS NOT NULL

?

palladin_jedi
На сайте с 13.07.2010
Offline
71
#2
Сайт о web-разработке и прочем (http://seazo.net)||Продвижение статьями под Google (http://short.seazo.net/ght4zf) Бесплатные консультации рефералам Sape (http://www.sape.ru/r.SWfwWOblBo.php) PHP и JS скрипты на заказ, создание сайтов с нуля и на CMS.
B
На сайте с 21.12.2009
Offline
28
#3

Что ж ссылку то не mysql.com написали ?

Сразу надо было туда слать....

Вопрос стоит в быстром решении, а не в читании книженции по мускулу, чтобы понять и сделать через 2 недели.

по посту №2

You can't specify target table 'profileskeys' for update in FROM clause

как и ожидалось.

Думаю тут надо

делать отдельную таблицу для результата

INSERT INTO newtmpstat (counter, pid) SELECT stats.counter, profileskeys.id

FROM stats

LEFT JOIN profileskeys ON stats.keyword = profileskeys.keyname

WHERE profileskeys.id IS NOT NULL

ORDER BY stats.counter DESC , stats.keyword ASC

А потом уже

UPDATE profileskeys SET counter = newtmpstat.counter WHERE id = newtmpstat.pid

и далее чистить временную.

Есть у кого более изящное решение ?

S0
На сайте с 20.11.2010
Offline
32
#4

boodda, в посте maldivec все верно. Вы, случаем, во вложенный select ничего больше не впихнули?

maldivec
На сайте с 04.11.2008
Offline
160
#5
boodda:
по посту №2
You can't specify target table 'profileskeys' for update in FROM clause
как и ожидалось.

Скорее всего вы во вложенном селекте пытаетесь выборку сделать по той же таблице, которую апдейтите. Проверьте - апдейтим 'profileskeys', а выборку делаем из 'stats'

B
На сайте с 21.12.2009
Offline
28
#6

Прошу прощения, да впихнул еще условие, но как оказалось зря)

Maldivec спасибо.

Странно что только такой запрос кушает не мало времени , около 7 секунд.

в stats 300 записей в profileskeys 161 тыс. записей.

Хотя это еще тепличный случай во время тестирования, реальные кол-во записей в stats будет несколько десятков тысяч.

Тяжёленький запрос....

Есть ли методы оптимизации в данном случае, при условии что индексы есть ?

И собственно последний вопрос, как удалить из stats те записи Counter от которых обновился в profileskeys ?

maldivec
На сайте с 04.11.2008
Offline
160
#7

Потому что у вас

boodda:
stats.keyword = profileskeys.keyname

скорее всего это varchar, индексы попробуйте добавить :) или сравнивайте по ключевым полям как-то... но это больше вопрос к проектировщику БД

B
На сайте с 21.12.2009
Offline
28
#8

И собственно последний вопрос, как удалить из stats те записи Counter от которых обновился в profileskeys ?

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий