0

次の構造の MySQL データベースがあります。

customers:

  • id (整数)
  • 名前 (文字列)
  • ...

orders:

  • id (整数)
  • 顧客 ID (整数)
  • タイムスタンプ_unix (整数)
  • 題名

ここで、すべての顧客とその最新の注文を選択したいと考えています。次のステートメントを試しました。

SELECT a.id, a.name, b.timestamp_unix, b.title FROM customers AS a JOIN orders AS b ON a.id = b.customerID GROUP BY a.id

これは、最新の注文 (およびそのタイトル) を取得しないことを除いて正常に機能しますが、最初の注文としてデータベースに挿入された最初の注文です。

では、どうすれば最新の注文 (最高idと最高timestamp_unix) を取得できますか? タイムスタンプのみを使用することもできますMAX(b.timestamp_unix)が、どうすれば一致するのb.titleですか?

ありがとうございました!

4

3 に答える 3

3

あなたはこれを試すことができます、私はそれをよくテストしました。

SELECT a.name as 'Customer Name', b.title as 'Order Title' FROM customers a, orders b where a.id=b.customerID AND b.timestamp_unix=(Select max(c.timestamp_unix) from orders c where c.customerID=a.id) GROUP BY a.id

于 2012-05-19T15:40:41.890 に答える
2
SELECT a.id, a.name, b.timestamp_unix, b.title 
FROM customers AS a 
JOIN (  SELECT customerID, timestamp_unix, title
        FROM orders
        ORDER BY timestamp_unix DESC) AS b
ON a.id = b.customerID 
GROUP BY a.id
ORDER BY timestamp_unix DESC

詳細については、この質問をお読みください

参照された質問で述べたように、この問題を解決するには少なくとも 2 つのアプローチがあります。最も安全で簡単な方法を選択してください。

于 2012-05-19T12:03:47.483 に答える
1

サブセレクトを行い、結合を行いますが、グループ化を取り除いてから、これを結合する必要があります

 Left join (select orderid from orders where customerid = A.customerid order by orderdate desc limit 1) as lastorder

もっと明確にしたいのですが、私は携帯電話にいます(笑)

ここで私は今私のPCにいます、これはそれを示すためのMSSQLフィドルです-Mysqlに変換するだけです(TOP 1を除いて構文は同じである必要があり、代わりに最後にLIMIT 1である必要があります)

http://sqlfiddle.com/#!3/29a3c/13

于 2012-05-19T12:04:26.920 に答える