2013-05-28 22 views
15

У меня есть две таблицы клиентов и заказов, ниже - структура.MySQL - выберите последнюю запись из второй таблицы, соответствующей первой таблице

Стол - клиенты

  • ID
  • customer_name

Стол - заказы

  • ID
  • order_id
  • customer_id

клиенты таблицы есть клиенты запись и заказы таблица имеет заказы клиентов,

customer_id в таблице заказов связан с идентификатора поля таблицы клиентов.

Теперь у одного клиента может быть ноль или один или несколько заказов, я хочу получить последний заказ, размещенный только клиентами.

, когда я запускаю следующий запрос просто невидимы присоединиться, он возвращает все заказы клиента

SELECT customers.customer_name,orders.order_id FROM orders,customers WHERE orders.customer_id=customers.id 

Я также пробовал разные РЕГИСТРИРУЙТЕСЬ заявления, но не может получить последний заказ клиента, я хочу получить его в одном запросе SQL для всех клиентов.

Заранее благодарю вас за помощь.

ответ

11

Попробуйте этот запрос,

SELECT 
    c.customer_name, 
    max(o.order_id) 
FROM 
    customers c 
INNER JOIN 
    orders o 
ON 
    o.customer_id = c.id 
GROUP BY 
    c.customer_name 

Вы не имеете поле даты в таблице заказа, чтобы предполагающей последний заказ будет тот, который имеет max(order_id).

+1

Спасибо за быстрый ответ , если order_id случайный, тогда это не сработает, но это ближайший к тому, что я ищу. – Alyas

+4

Я решил это со следующим: 'SELECT c.customer_name, o.customer_id, o.order_id, o.id ОТ клиентов c INNER JOIN orders o ON o.id = (SELECT id FROM orders WHERE customer_id = c.id ORDER BY id DESC LIMIT 1) ' – Alyas

+0

Да, это не сработает, если order_id случайный, тогда у вас должно быть поле даты, из которого мы можем получить order_date и найти последний заказ. – Meherzad

-1

Попробуйте этот запрос,

SELECT 
    c.customer_name, 
    o.order_id 
FROM 
    customers c 
INNER JOIN 
    orders o 
ON 
    o.customer_id = c.id 
ORDER BY 
    o.id desc 
LIMIT 1; 
+0

Это приведет только к возврату информации о последнем заказе клиента, в то время как мне нужна последняя информация о заказе каждого клиента. – Alyas

18

В MySQL есть только несколько способов, чтобы сделать его работу (, что теперь я на самом деле). Первый из них является своего рода ваш стол, как desc перед join:

SELECT c.customer_name, o.customer_id, o.order_id,o.id FROM customers c 
INNER JOIN orders o 
    ON o.id = (SELECT id FROM orders WHERE customer_id = c.id ORDER BY id DESC LIMIT 1) 

Использование в режиме реального времени является единственным способом, чтобы сделать это, но если вам нужно сделать некоторые присоединиться в не реальном времени вы можете создать временный таблица или псевдоним таблицы сортировки его, чтобы сделать ваш выбор, например:

CREATE TABLE tmp_your_table AS 
SELECT * FROM orders ORDER BY id DESC 

Итак, теперь вы можете сделать это присоединиться к работе:

SELECT c.customer_name, o.customer_id, o.order_id,o.id FROM customers c 
INNER JOIN tmp_your_table o ON o.id = tmp_your_table.id 
+0

Эта часть помогла мне по запросу 'INNER JOIN orders o ON o.id = (SELECT id FROM orders WHERE customer_id = c.id ORDER BY id DESC LIMIT 1)' – FosAvance

+0

Это помогло мне, спасибо: D – FosAvance

Смежные вопросы

 Смежные вопросы