Я использую 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 )
Я высоко ценю ваши ответы!
Предполагая, что ваш первый запрос дает ожидаемый результат, просто используйте 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
.
Предполагая, что последние цены являются самыми последними созданными и изображены 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
Я думаю, что у вас есть максимальная общая цена с названием продукта, поэтому ниже запрос в соответствии с вашими таблицами
выберите prices.id, products.id, products.product, sum (prices.prices), так как Totalprices от цен присоединяются к товарам по ценам.id = products.id group by prices.id order by Totalprices desc limit 1
Надеюсь, это поможет вам
created_date
- как показано выше2017-12-23 08:32:11
- тогда оно опущено. Так что, если цена имеет, например,created_date
на2017-04-23 05:55:55
то он остается с вышеупомянутым запросом.prices.product_id
. Но этот способ получения самой последней созданной цены (MAX()
из автоинкрементаprices.price_id
) странно,prices.created_at
доступенprices.created_at