![]() |
Req: запрос MySQL: обновление столбца одной таблицы данными из другой
имеются две таблицы:
reviews, структура и примерное содержание: ID RATING 2 3 (любое число) 1 5 (любое число) 3 2 (любое число) 2 9 (любое число) 1 3 (любое число) и mlist: NUM URATING 1 2 3 4 необходимо из первой таблицы найти среднее значение для каждого ID (т.е. в данном примере это будет выглядеть так: ID ROUND(avg(RATING))*1 2 6 1 4 3 2 и подставить полученные значения во вторую таблицу, чтоб получилось NUM URATING 1 4 2 6 3 2 4 0 вопрос: как это можно сделать одним запросом? (как полагаю, здесь subqueries должны использоваться) |
если бы были триггеры, можно было бы повесить на insert в первой таблице триггер, который бы обновлял данные во второй. а так, видимо, в два запроса.
insert update |
ок, а в два запроса это как? причем тут insert? убивать ни одну из строк (и уж тем более таблиц) нельзя! ибо в них не только эти данные содержатся (остальные столбцы убраны)
|
Видимо имелось в виду Select-Update
$sql="SELECT id, ROUND(avg(RATING)) as urating FROM reviews GROUP BY id ORDER BY id" затем foreach строка в результате запроса: UPDATE mlist SET URATING='$sql_f[urating]' WHERE num='$sql_f[id]' |
Код:
UPDATE votes SET round = Код:
CREATE TRIGGER [dbo].[VotesUpdateTrigger] ON [dbo].[reviews] WITH EXECUTE AS CALLER AFTER INSERT AS mysql 4.1 к сожалению нету(там бы работал вложенный запрос). ну и наконец, в целом, мне кажется невыгодной такая структура в принципе, тем более под мускул. имхо должно быть так: rtable eviews review_id, text table votes vote_id, review_id, vote_result а оценку выводить уже по запросу(т.е. делать агрегат каждый раз, а не хранить его и обновлять постоянно). |
Цитата:
Цитата:
Цитата:
|
не понял:
Код:
триггер тоже уже был организован. Однако с его использованием есть проблема. Таблица mlist очень часто обновляется путем очищения её содержимого и upload'ом нового запроса sql из файла. Этот файл генерится программой, таким образом изменить его содержимое нельзя. Лишь возможные варианты - использовать команду UPDATE или INSERT. Если выбирать UPDATE, то тогда новые данные, появившиеся в этом файле в базу не попадают. Если INSERT - то будут дубли (прописать ON DUPLICATE увы нельзя). Таким образом, если триггер и срабатывает при добавлении нового/изменении старого значения в таблице reviews, то после убийства содержимого mlist все данные в последней теряются.кстати, покажи как ты создаешь таблицы, интересуют ключи и индексы. чтобы не было дубликатов можно сделать на столбце id в таблице mlist индекс unique или даже сделать его primary. как именно происходит обновление mlist? в пакетном режиме? также напиши свою версию СУБД. |
Цитата:
Цитата:
Цитата:
Цитата:
|
все гениальное - просто!
вот он, нужный мне запрос: Код:
UPDATE mlist,reviews SET URATING=(SELECT ROUND(avg(reviews.RATING))*1 FROM reviews WHERE reviews.ID=mlist.NUM) WHERE reviews.ID=mlist.NUM |
| Часовой пояс GMT +4, время: 06:22. |
Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.