#mysql
#mysql
Вопрос:
Не уверен, как написать это объединение для 2 таблиц. Вот некоторые примеры данных для иллюстрации:
orders
-----------------------
| order_id | customer |
-----------------------
ABC12345 1
ABC12346 4
ABC12347 3
ABC12348 2
ABC12349 2
ABC12350 3
customers
-----------------------------------
| id | name | email |
-----------------------------------
1 James james@gmail.com
2 Alice alice@hotmail.com
3 Jimbo james@gmail.com
4 Jim james@gmail.com
5 Lucy lucy@yahoo.com
У меня есть order_id, который я уже знаю. Давайте используем первый в таблице: ABC12345. Как вы можете видеть, идентификатор клиента равен 1, так что заказ был размещен Джеймсом. Теперь иногда Джеймс снова заказывает, используя другие имена, но мы знаем, что это он, из-за его адреса электронной почты.
Итак, как мне получить все заказы Джеймса на основе его адреса электронной почты james@gmail.com , если я знаю один из его порядковых номеров (ABC12345)?
Редактировать: Не уверен, что я достаточно подчеркнул это… Джеймс заказывал 3 раза, используя один и тот же адрес электронной почты, но имена Джеймс, Джим и Джимбо. Мне нужны все его заказы, используя james@gmail.com в качестве адреса электронной почты.
Ответ №1:
SELECT o2.order_id
FROM orders o1
INNER JOIN customers c1
ON o1.customer = c1.id -- get the customer for the first order
INNER JOIN customers c2
ON c1.email = c2.email -- find all customers with same email
INNER JOIN orders o2
ON c2.id = o2.customer -- find all orders for those customers
WHERE o1.order_id = 'ABC12345'
Комментарии:
1. Хороший Джо, чище, чем моя версия, но я задаюсь вопросом о различиях в производительности между ними
![]()
2. Я думаю, что достаточно только одного соединения.
Ответ №2:
Вы можете использовать это:
SELECT order_id
FROM orders
WHERE customer IN (
SELECT id
FROM customers
WHERE email = (SELECT c.email FROM customers c JOIN orders o ON c.id = o.customer WHERE o.order_id = 'ABC12345')
)
Комментарии:
1. OP задал вопрос, как получить эти данные, » если я знаю один из его порядковых номеров (ABC12345) «. Ваш ответ совсем не помогает.
Ответ №3:
Сначала вам нужно количественно определить лицо заказа в таблице customer… Затем получите все идентификаторы клиентов по тому же адресу электронной почты… ЗАТЕМ получите заказы, которые соответствуют этим идентификаторам клиентов.
select o2.*
from orders o2
JOIN ( select c2.ID
from customers c2
join ( select c1.email
from orders o
join customers c1
on o.Customer = c1.ID
where
o.order_id = 'ABC12345' ) FoundTheEmail
on c2.email = FoundTheEmail.email
) as SameCustomerEMail
on o2.Customer = SameCustomerEMail.ID
Ответ №4:
ВЫБЕРИТЕ order_id ИЗ заказов, В КОТОРЫХ НАХОДИТСЯ клиент (ВЫБЕРИТЕ клиента ИЗ заказов, ГДЕ order_id = ‘ABC12345’)
Комментарии:
1. Мне нужен запрос, чтобы получить все заказы клиента на основе адреса электронной почты.
Ответ №5:
попробуйте это, поскольку у Джеймса только один заказ
SELECT orders.order_id, customers.name, customers.email
FROM orders
INNER JOIN customers ON customers.id = orders.customer
WHERE orders.orer_id = 'ABC12345'
Идентификатор заказа — это УНИКАЛЬНЫЙ номер, тогда у вас не будет двух заказов с одинаковым идентификатором, зачем заботиться об имени клиента?
«У каждого заказа будет идентификатор клиента».
Комментарии:
1. У Джеймса действительно 3 заказа, он просто использовал имя Джим и Джимбо в другие разы, поэтому мне тоже нужны эти заказы.
2. @Фернандо Коста я предоставил всю необходимую информацию. Я думаю, вы неправильно поняли вопрос. Я не знаю адрес электронной почты клиента, я знаю только один из номеров их заказа. Данные не важны, это просто в качестве примера.