Обновление кросс-таблицы MySQL

У меня есть таблица 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)