#mysql
#mysql
Вопрос:
У меня есть следующий запрос, который работает правильно, но я не понимаю, почему. Я меняю столбец баланса для каждой строки .. Как он узнает, какую строку обновлять для конкретного клиента.
UPDATE phppos_customers SET balance =
IFNULL((SELECT SUM(transaction_amount)
FROM `phppos_store_accounts`
WHERE deleted = 0 and customer_id = phppos_customers.person_id), 0);
Комментарии:
1. Это раздел ‘customer_id = phppos_customers.person_id’, который сообщает ему, как объединить таблицу, которую вы обновляете, и таблицу, из которой вы выбираете.
2. @Patrick Я не понимаю, что вы имеете в виду, говоря о том, как объединить таблицу вместе. Как он узнает, какую строку обновлять из подзапроса?
3. опубликовал ответ ниже с некоторыми подробностями, надеюсь, это поможет.
Ответ №1:
Для примера предположим, что у вас есть следующие две таблицы
[Users]
--------- ----------
| user_id | username |
--------- ----------
| 1 | patrick |
| 2 | chris |
--------- ----------
[Names]
--------- ------------ -----------
| user_id | first_name | last_name |
--------- ------------ -----------
| 1 | Patrick | Stewart |
| 2 | Chris | Angel |
--------- ------------ -----------
Если бы у вас был запрос на обновление, подобный тому, что был в вашем исходном сообщении, вы бы хотели сообщить ему, как выровнять две таблицы. Если у вас было предложение, В КОТОРОМ Users.user_id = Names.user_id , вы фактически указываете SQL просматривать данные так, как если бы обе таблицы были выровнены рядом, используя user_id в обеих таблицах, чтобы определить, где они совпадают. Это означало бы, что first_name и last_name в таблице [Имена] для идентификатора пользователя 1 будут использоваться при обновлении строки в таблице [Пользователи], которая является идентификатором пользователя 1. По сути, это просмотр данных, объединенных вместе, вот так:
[Users] and [Names] tables aligned by the user_id columns
--------- ---------- --------- ------------ -----------
| user_id | username | user_id | first_name | last_name |
--------- ---------- --------- ------------ -----------
| 1 | patrick | 1 | Patrick | Stewart |
| 2 | chris | 2 | Chris | Angel |
--------- ---------- --------- ------------ -----------
Поэтому, когда SQL выполняет обновление, он обновляет каждую строку соответствующими данными из другой таблицы, используя это выравнивание, чтобы узнать, какие данные использовать для обновления каждой строки.
Процесс выравнивания / слияния данных из нескольких таблиц называется объединением в SQL, вот еще немного информации, которая иллюстрирует, как это работает, если вам интересно.
Комментарии:
1. Я понимаю объединения при выполнении обычного выбора, но при выполнении подзапроса в обновлении я не вижу, как это применяется