Объединить последние записи с таблицей

0

Я использую mysql, и у меня есть следующие две таблицы:

Продукты:

| id | name      |
|----|-----------|
| 1  | Product 1 |
| 2  | Product 2 |
| 3  | Product 3 |

Цены:

| id | Product_id | created_at          | prices |
|----|------------|---------------------|--------|
| 1  | 1          | 2017-12-23 08:32:11 | 10     |
| 2  | 1          | 2017-11-21 03:33:10 | 12     |
| 3  | 2          | 2017-12-23 08:32:11 | 43     |
| 4  | 2          | 2017-11-21 03:33:10 | 23     |
| 5  | 3          | 2017-12-23 08:32:11 | 78     |
| 6  | 3          | 2017-11-21 03:33:10 | 34     |

Если я сделаю:

SELECT * FROM prices WHERE prices.id IN ( SELECT MAX(prices.id) FROM prices GROUP BY prices.created_at ) 

Это дает мне последние цены для каждого product_id:

| id | Product_id | created_at          | prices |
|----|------------|---------------------|--------|
| 1  | 1          | 2017-12-23 08:32:11 | 10     |
| 3  | 2          | 2017-12-23 08:32:11 | 43     |
| 5  | 3          | 2017-12-23 08:32:11 | 78     |

Я хотел бы иметь в качестве окончательного результата все продукты с самыми последними ценами, которые выглядели бы следующим образом:

| id | name      | product_id | created_at          | prices |
|----|-----------|------------|---------------------|--------|
| 1  | Product 1 | 1          | 2017-12-23 08:32:11 | 10     |
| 2  | Product 2 | 2          | 2017-12-23 08:32:11 | 43     |
| 3  | Product 3 | 3          | 2017-12-23 08:32:11 | 78     |

Однако я не уверен, как объединить:

select * from products

а также

SELECT * FROM prices WHERE prices.id IN ( SELECT MAX(prices.id) FROM prices GROUP BY prices.created_at ) 

Я высоко ценю ваши ответы!

Теги:
database

3 ответа

1
Лучший ответ

Предполагая, что ваш первый запрос дает ожидаемый результат, просто используйте join.

SELECT p.*,d.name FROM prices p
inner join product d 
on d.id=p.product_id
WHERE 
p.id IN 
    ( SELECT MAX(prices.id) FROM prices GROUP BY prices.created_at ) 

Если вы считаете, что есть идентификатор продукта в price который не отображается в product используйте left join вместо inner join.

  • 0
    Спасибо за ваш ответ! У меня одна проблема с вашим запросом. Если цена не обновляется на том же created_date - как показано выше 2017-12-23 08:32:11 - тогда оно опущено. Так что, если цена имеет, например, created_date на 2017-04-23 05:55:55 то он остается с вышеупомянутым запросом.
  • 0
    может быть исправлено с помощью prices.product_id . Но этот способ получения самой последней созданной цены ( MAX() из автоинкремента prices.price_id ) странно, prices.created_at доступен prices.created_at
0

Предполагая, что последние цены являются самыми последними созданными и изображены prices.created_at, чтобы получить последние цены, вы можете лучше полагаться на prices.created_at, вместо того, чтобы предполагать хронологическое упорядочение по prices.id (автоинкремент), как в:

SELECT products.id, products.name, prices.created_at, prices.prices
FROM products 
INNER JOIN prices ON products.id=prices.product_id
INNER JOIN 
(SELECT product_id, MAX(created_at) AS created_at FROM prices GROUP BY product_id) AS LATEST_PRICES
on prices.product_id=LATEST_PRICES.product_id
-- WHERE prices.created_at = LATEST_PRICES.created_at
AND prices.created_at = LATEST_PRICES.created_at
0

Я думаю, что у вас есть максимальная общая цена с названием продукта, поэтому ниже запрос в соответствии с вашими таблицами

выберите prices.id, products.id, products.product, sum (prices.prices), так как Totalprices от цен присоединяются к товарам по ценам.id = products.id group by prices.id order by Totalprices desc limit 1

Надеюсь, это поможет вам

Ещё вопросы

Сообщество Overcoder
Наверх
Меню