2013-05-28 8 views
15

Ho due tabelle clienti e ordini, di seguito è riportata la struttura.MySQL - Seleziona l'ultimo record dalla seconda tabella corrispondente alla prima tabella

Tabella - clienti

  • id
  • customer_name

Tabella - ordini

  • id
  • order_id
  • customer_id

tabella clienti avere clienti e gli ordini record tavolo hanno ordini effettuati dai clienti,

CUSTOMER_ID nella tabella degli ordini è legata alla id campo della tabella di clienti.

Ora un cliente può avere zero o uno o più ordini, voglio ottenere l'ultimo ordine effettuato solo dai clienti.

quando ho eseguito la seguente query partecipare a una semplice invisibile, restituisce tutti gli ordini dal cliente

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

Ho anche provato diverse ENTRA dichiarazioni ma non può ottenere l'ultimo ordine da parte del cliente, voglio ottenere in una query SQL per tutti i clienti.

Grazie in anticipo per il vostro aiuto.

risposta

11

Prova questa ricerca

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 

Non è necessario alcun campo data nella tabella ordine in modo assumendo la ultimo ordine sarà quella che ha max(order_id).

+1

Grazie per la vostra risposta rapida , se order_id è casuale, questo non funzionerebbe, ma questo è il più vicino a quello che sto cercando. – Alyas

+4

L'ho risolto con il seguente; 'SELEZIONA c.customer_name, o.customer_id, o.order_id, o.id DA clienti c ORDINE INTERNO ordini o ON o.id = (ID SELECT FROM ordini WHERE customer_id = c.id ORDER BY id DESC LIMIT 1) ' – Alyas

+0

Sì, non funzionerebbe se order_id fosse casuale, quindi dovresti avere il campo data da cui possiamo ottenere un order_date e trovare l'ultimo ordine – Meherzad

-1

Prova questa ricerca

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

Questo restituirebbe solo le informazioni sull'ultimo ordine di un cliente, mentre avevo bisogno delle informazioni sull'ultimo ordine di ogni cliente. – Alyas

18

In MySQL c'è solo pochi modi per farlo funzionare (che ora effettivamente). Il primo è una sorta vostro tavolo come desc prima della 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) 

Utilizzando in tempo reale è l'unico modo per farlo fare, ma se avete bisogno di fare qualche unirsi in tempo non reale è possibile creare una temporanea tavolo o una tabella alias di ordinamento per rendere il vostro prescelto, in questo modo:

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

Così ora si è in grado di fare questo lavoro di unirsi:

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

Questa parte mi ha aiutato per la mia domanda 'INTERNO JOIN ordini ON o.id = (ID SELECT FROM ordini WHERE customer_id = c.id ORDINE BY id LIMITE DI DESCRIZIONE 1)' – FosAvance

+0

Questo mi ha aiutato molto, grazie: D – FosAvance