| imho.ws |
![]() |
|
|
|||||||
|
Сообщения:
Перейти к новому /
Последнее
|
Опции темы |
|
|
# 1 |
|
Full Member
Регистрация: 15.11.2002
Адрес: Moscow
Сообщения: 834
![]() ![]() ![]() ![]() ![]() |
имеются две таблицы:
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 должны использоваться) |
|
|
|
|
# 4 |
|
Junior Member
Регистрация: 10.07.2003
Адрес: г. Королев, Россия
Сообщения: 188
![]() ![]() |
Видимо имелось в виду 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]' |
|
|
|
|
# 5 |
|
Full Member
Регистрация: 29.05.2002
Сообщения: 544
![]() ![]() ![]() ![]() ![]() |
Код:
UPDATE votes SET round = ( SELECT avg( rating ) FROM reviews WHERE id = 1 GROUP BY id ) WHERE id = 1 Код:
CREATE TRIGGER [dbo].[VotesUpdateTrigger] ON [dbo].[reviews] WITH EXECUTE AS CALLER AFTER INSERT AS begin --check id if (exists(select v.id from votes v inner join inserted i on v.id = i.id)) begin UPDATE votes SET round = ( SELECT avg( rating ) FROM reviews WHERE id = 1 GROUP BY id ) WHERE id = 1 end else begin insert into votes(id, round) select i.id, i.rating from inserted i end end ![]() mysql 4.1 к сожалению нету(там бы работал вложенный запрос). ну и наконец, в целом, мне кажется невыгодной такая структура в принципе, тем более под мускул. имхо должно быть так: rtable eviews review_id, text table votes vote_id, review_id, vote_result а оценку выводить уже по запросу(т.е. делать агрегат каждый раз, а не хранить его и обновлять постоянно).
__________________
убрано по просьбе администратора
|
|
|
|
|
# 6 | |||
|
Full Member
Регистрация: 15.11.2002
Адрес: Moscow
Сообщения: 834
![]() ![]() ![]() ![]() ![]() |
Цитата:
Цитата:
Цитата:
|
|||
|
|
|
|
# 7 |
|
Full Member
Регистрация: 29.05.2002
Сообщения: 544
![]() ![]() ![]() ![]() ![]() |
не понял:
Код:
триггер тоже уже был организован. Однако с его использованием есть проблема. Таблица mlist очень часто обновляется путем очищения её содержимого и upload'ом нового запроса sql из файла. Этот файл генерится программой, таким образом изменить его содержимое нельзя. Лишь возможные варианты - использовать команду UPDATE или INSERT. Если выбирать UPDATE, то тогда новые данные, появившиеся в этом файле в базу не попадают. Если INSERT - то будут дубли (прописать ON DUPLICATE увы нельзя). Таким образом, если триггер и срабатывает при добавлении нового/изменении старого значения в таблице reviews, то после убийства содержимого mlist все данные в последней теряются. кстати, покажи как ты создаешь таблицы, интересуют ключи и индексы. чтобы не было дубликатов можно сделать на столбце id в таблице mlist индекс unique или даже сделать его primary. как именно происходит обновление mlist? в пакетном режиме? также напиши свою версию СУБД.
__________________
убрано по просьбе администратора
|
|
|
|
|
# 8 | ||||
|
Full Member
Регистрация: 15.11.2002
Адрес: Moscow
Сообщения: 834
![]() ![]() ![]() ![]() ![]() |
Цитата:
Цитата:
Цитата:
Цитата:
)) не тот проект, чтобы для него свою СУБД писать...
|
||||
|
|
|
|
# 9 |
|
Full Member
Регистрация: 15.11.2002
Адрес: Moscow
Сообщения: 834
![]() ![]() ![]() ![]() ![]() |
все гениальное - просто!
вот он, нужный мне запрос: Код:
UPDATE mlist,reviews SET URATING=(SELECT ROUND(avg(reviews.RATING))*1 FROM reviews WHERE reviews.ID=mlist.NUM) WHERE reviews.ID=mlist.NUM |
|
|