web-dev-qa-db-ja.com

MySQL-最初のテーブルと一致する2番目のテーブルから最後のレコードを選択します

顧客と注文の2つのテーブルがあります。構造は次のとおりです。

表-顧客

  • id
  • 顧客名

表-注文

  • id
  • order_id
  • 顧客ID

customersテーブルには顧客レコードがあり、Ordersテーブルには顧客による注文があり、

注文テーブルのcustomer_idは、顧客テーブルのidフィールドにリンクされています。

これで、1人の顧客が注文をゼロま​​たは1つ以上持つことができます。最後に注文したのは顧客のみです。

次のクエリを実行すると、単純な非表示の結合で、顧客によるすべての注文が返されます

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

別のJOINステートメントも試しましたが、顧客による最後の注文を取得できません。すべての顧客に対して1つのSQLクエリで取得したいと考えています。

よろしくお願いします。

16
Alyas

このクエリを試してください

_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)の注文であると想定します。

13
Meherzad

MySQLでは、それを機能させるためのいくつかの方法があります(私が実際に)。 1つ目は、テーブルを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
23
vinibarr