У меня есть таблица users
таблица sales
.
Таблица users
имеет id
столбцов и annual_plan_length
, monthly_plan_length
.
Пример строки пользователя:
id | annual_plan_length | monthly_plan_length
55 | 0 | 0
В таблице sales
есть id
столбцов, user_id
, product
Примеры рядов sales
:
id | user_id | product
1 | 55 | monthly
2 | 55 | annually
Я пытаюсь написать запрос, чтобы обновить столбец длины плана пользователя в зависимости от того, сколько покупок они сделали с помощью таблицы sales
.
Вот что я получил до сих пор:
function updateLength($product, $column) { global $emdb; mysql_query("UPDATE users JOIN sales ON sales.user_id = users.id SET users.`".mysql_real_escape_string($column)."` = count(sales.id) GROUP BY sales.user_id WHERE sales.product = '".mysql_real_escape_string($product)."'", $emdb); } updateLength('monthly', 'annual_plan_length'); updateLength('annually', 'monthly_plan_length');
Этот запрос не работает, но с вашей помощью это должно annual_plan_length
к тому, что для идентификатора пользователя 55 будет annual_plan_length
значение 1 в столбцах monthly_plan_length
и annual_plan_length
.
Пс .: Я знаю, что PDO лучше, но он еще не используется для проекта этого клиента. Ps .: Ошибка синтаксиса рядом с GROUP BY
Вы можете использовать GROUP BY
в конце вашего запроса. Я вижу проблему в вашем запросе, потому что вы хотите обновлять каждого пользователя, имеющего один и тот же продукт, но с разными значениями покупок.
Вам нужно удалить GROUP BY
.
Возможно, это поможет вам:
UPDATE users JOIN sales ON sales.user_id = users.id SET users.annual_plan_length = (SELECT count(user_id) FROM sales WHERE user_id = 1) WHERE sales.product = 'monthly';
Сначала вы можете рассчитать результаты в подзапросе, а затем обновить данные для всех пользователей.
Попробуйте этот запрос:
UPDATE (SELECT `user_id`, SUM(IF(`product` = 'monthly', 1, 0)) AS `monthly`, SUM(IF(`product` = 'annually', 1, 0)) AS `annually` FROM `sales` WHERE 1 GROUP BY `user_id`) AS `s` INNER JOIN `users` AS `u` ON `u`.`id` = `s`.`user_id` SET `u`.`annual_plan_length` = `s`.`annually`, `u`.`monthly_plan_length` = `s`.`monthly`
Вы не можете использовать JOIN
в инструкции обновления. Вместо этого используйте вложенный запрос SELECT
для получения счета:
UPDATE table SET field = (SELECT COUNT(some_other_filed) FROM other_table WHERE your_field = condition)