Какой самый эффективный способ написать запрос, чтобы получить последний элемент из коллекции? - PullRequest
0 голосов
/ 22 сентября 2009

Извините за название. Это было лучшее, что я мог придумать.

В любом случае, вот мой вопрос - у меня есть 2 таблицы, таблица клиентов и таблица заказов, как показано ниже:

Customer {
  Long id;
  String name;
  String address;
  Timestamp createdOn;
}

Order {
  Long id;
  String productName;
  Long customerId;
  Timestamp createdOn;
}

Существует отношение один-ко-многим от Клиента к Заказу, то есть у Клиента может быть много Заказов, как указано в customerId.

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

SELECT *
FROM CUSTOMER AS CUSTOMERS
INNER JOIN (
  SELECT *
  FROM ORDER AS BASE_ORDERS
  INNER JOIN (
    SELECT MAX_ORDERS.CUSTOMERID,
      MAX(MAX_ORDERS.CREATEDON)
    FROM ORDER AS MAX_ORDERS
    GROUP BY CUSTOMERID
  ) AS GROUPED_ORDERS
  ON BASE_ORDERS.CUSTOMERID = GROUPED_ORDERS.CUSTOMERID
    AND BASE_ORDERS.CREATEDON = GROUPED_ORDERS.CREATEDON
) AS LATEST_ORDERS
ON CUSTOMERS.ID = LATEST_ORDERS.CUSTOMERID

Есть ли лучший способ сделать это? Единственный другой способ, о котором я могу подумать, - это добавить новое поле с именем «isLatest» и установить его значение «истина» каждый раз, когда для клиента создается новый заказ.

Дайте мне знать, что вы думаете.

Ответы [ 2 ]

1 голос
/ 22 сентября 2009

Я нахожу этот вариант немного чище:

select c.*, o.*
from (
    select customerid, max(createdOn) as MaxCreatedOn
    from Order
    group by customerid
) mo
inner join Order o on mo.customerid = o.customerid and mo.MaxCreatedOn = o.createdOn
inner join Customer c on o.customerid = c.id
0 голосов
/ 22 сентября 2009

Что-то вроде этого:

SELECT
 c.*,
 o.*
FROM
 Customers c
INNER JOIN
 Orders o ON o.customerId = c.id
GROUP BY
 c.id
ORDER BY
 o.createdOn DESC

Не уверен, насколько эффективно это будет с заявлениями Group и Order By, но я верю, что он даст вам данные, которые вы ищете.

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