Получить MAX введенную дату в подзапросе - PullRequest
0 голосов
/ 08 мая 2018

У меня есть скрипт, который работает, но не так, как хотелось бы. Моя цель - выбрать самую последнюю введенную запись в базе данных plans для каждого продавца в списке account_manager_sellers.

Текущая проблема с приведенным ниже сценарием: например, он возвращает самую старую запись, а не самую новую, например: он выбирает запись в 2016 году, а не ту, которая имеет метку времени в 2018. (в конце концов мне нужно изменить Предложение WHERE для получения всех записей lastsale до 2017-01-01.

Простые образцы базы данных.

plans AKA (список продаж)

+----+------------------+-----------+
| id |   plan_written   | seller_id |
+----+------------------+-----------+
|  1 | 20/09/2016 09:12 |       123 |
|  2 | 22/12/2016 09:45 |       444 |
|  3 | 19/10/2016 09:07 |       555 |
|  4 | 02/10/2015 14:26 |       123 |
|  5 | 15/08/2016 11:06 |       444 |
|  6 | 16/08/2016 11:03 |       123 |
|  7 | 03/10/2016 10:15 |       555 |
|  8 | 28/09/2016 10:12 |       123 |
|  9 | 27/09/2016 15:12 |       444 |
+----+------------------+-----------+

account_manager_sellers (список продавцов)

+-----+----------+
| id  |   name   |
+-----+----------+
| 123 | person 1 |
| 444 | person 2 |
| 555 | person 3 |
+-----+----------+

Используемый текущий код

SELECT p.plan_written, p.seller_id
FROM plans AS p NATURAL JOIN (
         SELECT   id, MAX(plan_written) AS lastsale
         FROM     plans
         GROUP BY seller_id
       ) AS t
JOIN account_manager_sellers AS a ON a.id = p.seller_id
WHERE  lastsale < "2018-05-08 00:00:00"

Краткое описание

Используя приведенный выше код и таблицы примеров, этот код будет возвращать эти 3 результата, в то время как мы ожидаем, что 3 результата MAX (plan_written), похоже, не последовали, я предполагаю, что это как-то связано с предложение GROUP, я не уверен, сможем ли мы использовать предложения ORDER BY и LIMIT?

+--------------+------------------+
| seller_id    |   plan_written   |
+--------------+------------------+
|          123 | 16/08/2016 11:03 |
|          444 | 15/08/2016 11:06 |
|          555 | 03/10/2016 10:15 |
+--------------+------------------+

1 Ответ

0 голосов
/ 08 мая 2018

Условие соединения в вашем запросе отключено, и вы должны ограничить максимальную дату для каждого продавца. Кроме того, вам не нужно присоединяться к таблице account_manager_sellers, чтобы получить ожидаемый результат:

SELECT p1.*
FROM plans p1
INNER JOIN
(
    SELECT
        seller_id, MAX(plan_written) AS max_plan_written
    FROM plans
    WHERE plan_written < '2018-05-08 00:00:00'
    GROUP BY seller_id
) p2
    ON p1.seller_id = p2.seller_id AND
       p1.plan_written = p2.max_plan_written;
...