Запрос MySQL — запрос объединения

#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. @Фернандо Коста я предоставил всю необходимую информацию. Я думаю, вы неправильно поняли вопрос. Я не знаю адрес электронной почты клиента, я знаю только один из номеров их заказа. Данные не важны, это просто в качестве примера.