Операнд должен содержать 1 столбец при объединении таблиц с обновлением
Я пытаюсь обновить таблицу путем объединения двух запросов следующим образом
UPDATE result, games_played
SET result.precentage_correct =
(
SELECT user_id, 100*SUM(n_win)/SUM(n_total) AS pct_win FROM
(SELECT user_id, COUNT(user_id) AS n_win,
NULL AS n_total
FROM games_played
WHERE winner != 'n'
AND game = 1
GROUP BY user_id
UNION SELECT user_id, NULL AS n_win,
COUNT(user_id) AS n_total
FROM games_played
WHERE game = 1
GROUP BY user_id
) AS counts
GROUP BY counts.user_id
)
WHERE result.user_id = games_played.user_id
Однако я получаю ошибку
Operand should contain 1 column(s)
Кто-нибудь знает, что я делаю не так... Я могу выбрать результат в виде новой таблицы
SQL скрипка http://sqlfiddle.com/
3 ответа
Попробуйте добавить критерии фильтра в свой подзапрос. Ошибка "Подзапрос возвращает более 1 строки", как вы упомянули в комментарии, означает, что подзапрос (тот, который вы назвали AS), вернул более одного результата. Что-то вроде этого:
UPDATE result, games_played
SET result.precentage_correct =
(
SELECT 100*SUM(n_win)/SUM(n_total) AS pct_win FROM
(SELECT user_id, COUNT(user_id) AS n_win,
NULL AS n_total
FROM games_played
WHERE winner != 'n'
AND game = 1
GROUP BY user_id
UNION SELECT user_id, NULL AS n_win,
COUNT(user_id) AS n_total
FROM games_played
WHERE game = 1
GROUP BY user_id
) AS counts
GROUP BY counts.user_id
HAVING counts.user_id = result.user_id
)
WHERE result.user_id = games_played.user_id
Вы можете упростить UPDATE
, Смотрите SQL-скрипку:
UPDATE result
SET result.precentage_correct =
( SELECT 100*SUM(winner <> 'n')/COUNT(*) AS pct_win
FROM games_played
WHERE game = 1
AND result.user_id = games_played.user_id
) ;
Или с запросом, больше похожим на вашу логику. Это даже лучше, потому что (в отличие от предыдущего) это не будет UPDATE
целый result
таблицы (с пустыми значениями для тех пользователей, в которых нет игр), но только для тех пользователей, у которых есть хотя бы один результат в games_played
Таблица. Протестировано на SQL-Fiddle-2
UPDATE result AS r
JOIN
( SELECT user_id,
100*SUM(winner <> 'n')/COUNT(*) AS pct_win
FROM games_played
WHERE game = 1
GROUP BY user_id
) AS gp
ON r.user_id = gp.user_id
SET r.precentage_correct = gp.pct_win ;
Я не слишком уверен в логике вашего запроса, но вы можете исправить синтаксическую ошибку, фактически используя запрос в виде таблицы, добавив его в список исходных таблиц.
UPDATE result, games_played,
(SELECT t1.user_id, 100*SUM(t1.n_win)/SUM(t1.n_total) AS pct_win FROM
(SELECT user_id, COUNT(user_id) AS n_win, NULL AS n_total
FROM games_played
WHERE winner != 'n' AND game = 1
GROUP BY user_id
UNION
SELECT user_id, NULL AS n_win, COUNT(user_id) AS n_total
FROM games_played
WHERE game = 1
GROUP BY user_id
) AS t1
) AS counts
SET result.precentage_correct = counts.pct_win
WHERE result.user_id = games_played.user_id