Я использую mysqlnd 5.0.12-dev
db в качестве моего бэкэнд, и мне бы хотелось вернуться, последняя строка в wp_productprofitability
для каждого post_id.
У меня есть следующая настройка:
wp_post
:
+----+--------------+
| ID | title |
+----+--------------+
| 10 | My Product 1 |
+----+--------------+
| 11 | My Product 2 |
+----+--------------+
| 6 | My Product 3 |
+----+--------------+
wp_productprofitability
+---------+-------------------+---------------------+
| post_id | daily_grossProfit | created_at |
+---------+-------------------+---------------------+
| 10 | 3.5 | 2018-06-18 07:36:00 |
+---------+-------------------+---------------------+
| 11 | 4 | 2018-06-17 07:35:00 |
+---------+-------------------+---------------------+
| 10 | 5 | 2018-06-16 07:34:00 |
+---------+-------------------+---------------------+
| 11 | 7 | 2018-06-17 07:36:00 |
+---------+-------------------+---------------------+
| 10 | 5 | 2018-06-15 07:36:00 |
+---------+-------------------+---------------------+
| 6 | 3.6 | 2018-06-12 07:34:00 |
+---------+-------------------+---------------------+
| 10 | 2 | 2018-06-14 07:32:00 |
+---------+-------------------+---------------------+
| 6 | 6 | 2018-06-13 07:31:00 |
+---------+-------------------+---------------------+
Ожидаемый результат:
+----+--------------+---------+-------------------+---------------------+
| ID | title | post_id | daily_grossProfit | created_at |
+----+--------------+---------+-------------------+---------------------+
| 10 | My Product 1 | 10 | 3.6 | 2018-06-18 07:36:00 |
+----+--------------+---------+-------------------+---------------------+
| 11 | My Product 2 | 11 | 4 | 2018-06-17 07:36:00 |
+----+--------------+---------+-------------------+---------------------+
| 6 | My Product 3 | 6 | 5 | 2018-06-16 07:34:00 |
+----+--------------+---------+-------------------+---------------------+
Atm Я получаю следующий результат только для следующего запроса:
SELECT
*
FROM
wp_posts p
INNER JOIN wp_productprofitability m ON
m.post_id = p.ID
WHERE
m.created_at =(
SELECT
MAX(u.created_at)
FROM
wp_productprofitability u
)
ORDER BY
m.daily_grossProfit
DESC
Текущий результат:
+----+--------------+---------+-------------------+---------------------+
| ID | title | post_id | daily_grossProfit | created_at |
+----+--------------+---------+-------------------+---------------------+
| 10 | My Product 1 | 10 | 3.6 | 2018-06-18 07:36:00 |
+----+--------------+---------+-------------------+---------------------+
| 11 | My Product 2 | 11 | 4 | 2018-06-17 07:36:00 |
+----+--------------+---------+-------------------+---------------------+
Любые предложения, как получить для каждого post_id последнее присутствие?
Я ценю ваши ответы!
Вы близки. Вам просто нужна фраза корреляции:
SELECT *
FROM wp_posts p INNER JOIN
wp_productprofitability pp
ON pp.post_id = p.ID
WHERE m.created_at = (SELECT MAX(pp2.created_at)
FROM wp_productprofitability pp2
WHERE pp2.post_id = pp.post_id
)
ORDER BY pp.daily_grossProfit DESC
Я бы использовал ваш запрос, используя вашу таблицу, в подзапрос, который находит самую последнюю запись в wp_productprofitability
для каждого post_id
:
SELECT
t1.ID,
t1.title,
t2.post_id,
t2.daily_grossProfit,
t2.created_at
FROM wp_post t1
INNER JOIN wp_productprofitability t2
ON t1.ID = t2.post_id
INNER JOIN
(
SELECT post_id, MAX(created_at) AS max_created_at
FROM wp_productprofitability
GROUP BY post_id
) t3
ON t2.post_id = t3.post_id AND t2.created_at = t3.max_created_at;
См. Ответ Гордона для исправления вашего точного запроса. В принципе, вам нужно добавить логику в подзапрос, который ограничивает каждую запись в wp_productprofitability
последним для каждого post_id
. Но здесь я бы не использовал коррелированный подзапрос, и соединение, вероятно, превзойдет его.