SQLinfo.ru - Все о MySQL Webew.ru: теория и практика веб-технологий

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 18.05.2011 19:54:57

pkhell
Активист
Зарегистрирован: 23.03.2011
Сообщений: 127

Занимательный UPDATE или проблемы с синтаксисом

Здравствуйте. Есть задача: Уменьшите на 20% количество очков у лучшей на данный момент команды лиги.
Есть запрос:

UPDATE Bout SET Point = (Point*20) DIV 100 WHERE Participant = (SELECT Participant
FROM Participant
WHERE Name = (
SELECT M.Name
FROM (

SELECT G.name, Sred
FROM (

SELECT Participant.Name, SUM( POINT ) AS Sred
FROM Bout
INNER JOIN Participant ON Participant.participant = Bout.participant
GROUP BY Participant.Name ) AS G
WHERE Sred = (
SELECT MAX( T.Sred )
FROM (

SELECT Participant.Name, SUM( POINT ) AS Sred
FROM Bout
INNER JOIN Participant ON Participant.participant = Bout.participant
GROUP BY Participant.Name ) AS T
)
) AS M
))
 

Проблема в том, что подзапрос возвращает 3 записи, из-за чего UPDATE отказывается работать. Как можно преобразовать запрос на поочередное обновление, либо просто разбить выходное результат и сделать 3 разных запроса. Возможно ли упростить и модифицировать данный запрос? Спасибо.


Прикрепленные файлы:
Attachment Icon basa.sql, Размер: 5,761 байт, Скачано: 588

Неактивен

 

#2 19.05.2011 03:08:11

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Занимательный UPDATE или проблемы с синтаксисом

Замените «=» на «IN»?

Ну и «на 20%» означает, что умножать надо на 0.8, а не на 0.2 smile

Неактивен

 

#3 19.05.2011 12:00:50

pkhell
Активист
Зарегистрирован: 23.03.2011
Сообщений: 127

Re: Занимательный UPDATE или проблемы с синтаксисом

Вот спасибо Вам огромное. Я очень благодарен, что Вы откликнулись на мою просьбу. В результате у меня получился следующий запрос:


UPDATE Bout SET Point = Point - (Point*0.2) WHERE Participant IN (SELECT Participant
FROM Participant
WHERE Name = (
SELECT M.Name
FROM (

SELECT G.name, Sred
FROM (

SELECT Participant.Name, SUM( POINT ) AS Sred
FROM Bout
INNER JOIN Participant ON Participant.participant = Bout.participant
GROUP BY Participant.Name ) AS G
WHERE Sred = (
SELECT MAX( T.Sred )
FROM (

SELECT Participant.Name, SUM( POINT ) AS Sred
FROM Bout
INNER JOIN Participant ON Participant.participant = Bout.participant
GROUP BY Participant.Name ) AS T
)
) AS M
))
 

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson