2013-05-28 16 views
15

Mam dwóch tabel klientów i zamówień, poniżej znajduje się struktura.MySQL - Wybierz ostatni rekord z drugiej tabeli pasującej do pierwszej tabeli

Tabela - klientów

  • id
  • CUSTOMER_NAME

Tabela - zamówienia

  • ID
  • order_id
  • customer_id

tabeli klienci mają rekordy klientów i zlecenia tabeli mają zamówień składanych przez klientów,

customer_id zamówień tabeli jest powiązany z id polu tabeli klientów.

Teraz jeden klient może mieć zero lub jedno lub więcej niż jedno zamówienie, chcę otrzymać ostatnie zamówienie złożone tylko przez klientów.

kiedy uruchomić następujące zapytanie prosty niewidoczny przyłączenia, zwraca wszystkie zlecenia przez klienta

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

Próbowałem również inny JOIN, ale nie może uzyskać ostatniego zamówienia przez klienta, chcę pobierz ją w jednym zapytaniu SQL dla wszystkich klientów.

Z góry dziękujemy za pomoc.

Odpowiedz

11

Spróbuj tego zapytania

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 

Nie ma żadnego pola daty w tabeli zleceń więc zakładając najnowsze zamówienie zostanie ten, który ma max(order_id).

+1

Dziękuję za szybką odpowiedź , jeśli order_id jest losowy, to nie zadziałałoby, ale jest to najbliższe temu, czego szukam. – Alyas

+4

Mam rozwiązać go z następujących; 'SELECT c.nazwa klienta, o.customer_id, o.order_id, o.id OD klientów c INNER ŁĄCZĄ zamówienia o ON o.id = (WYBIERZ ID z zamówień WHERE customer_id = c.id ZAMÓWIENIE PRZEZ id DESC LIMIT 1) ' – Alyas

+0

Tak, to nie zadziała, jeśli order_id jest losowy, wtedy powinieneś mieć pole daty, z którego możemy dostać order_date i znaleźć najnowsze zamówienie – Meherzad

-1

Spróbuj tego zapytania

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

To zwróci tylko informacje o ostatnim zamówieniu jednego klienta, a ja potrzebuję informacji ostatniego zamówienia każdego klienta. – Alyas

18

w MySQL istnieje tylko kilka sposobów, aby to działało (że teraz faktycznie). Pierwszym z nich jest rodzaj tabela jak desc przed 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) 

Korzystanie w czasie rzeczywistym jest jedynym sposobem, aby to zrobić, ale jeśli trzeba, że ​​niektóre przystąpić nie w czasie rzeczywistym można utworzyć tymczasowy stół lub stolik alias sortowania go, aby utworzy wybierz coś takiego:

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

Więc teraz jesteś w stanie zrobić to dołączyć pracy:

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

Ta część pomogła mi w zapytaniu 'INNER JOIN orders o ON o.id = (WYBIERZ id ​​Z zamówień WHERE customer_id = c.id ORDER BY id DESC LIMIT 1)' – FosAvance

+0

Ten pomógł mi bardzo, dziękuję: D – FosAvance

Powiązane problemy