【问题标题】:MySQL - search date range and group by lowest differenceMySQL - 按最低差异搜索日期范围和分组
【发布时间】:2021-06-08 16:58:43
【问题描述】:

我需要在所有对象中找到一个尽可能接近人们正在搜索的所需日期范围的价格。一个对象可以在不同的日期范围内有多个价格。

价格表

id objectid price start end
1 21 50 2021-01-01 2021-04-01
2 21 60 2021-04-02 2021-08-01
3 22 30 2021-01-01 2021-04-01
4 23 150 2021-01-01 2021-04-01
5 21 20 2021-08-02 2021-09-01
6 23 120 2021-07-01 2021-08-01

假设人们在2021-05-012021-06-01 之间进行搜索,结果应该是:

id objectid price
2 21 60
3 22 30
6 23 120

我正在处理这个查询,但在某个地方我失去了焦点。

SELECT p.objectid,
    p.id
    p.start,
    p.end,
    p.price,
    ABS(DATEDIFF(p.start, '2021-05-01') + DATEDIFF(p.end, '2021-06-01')) diff
FROM
    prices AS p1
INNER JOIN(
    SELECT
        p.objectid,
        MIN(
            ABS(
                DATEDIFF(start, '2021-05-01') + DATEDIFF(end, '2021-06-01')
            )
        ) AS diff
    FROM
        prices p
    GROUP BY
        p.objectid
) p2
ON
    p1.objectid = p2.objectid AND diff = p2.diff

【问题讨论】:

    标签: mysql join group-by datediff


    【解决方案1】:

    您可以通过自加入来实现此目的。
    试试下面的查询

    SELECT
        Y.id,
        Y.objectid,
        Y.price
    FROM
        (
        SELECT
            *,
            ABS(
                DATEDIFF(`start`, '2021-05-01') + DATEDIFF(`end`, '2021-06-01')
            ) AS `diff`
        FROM
            price
    ) AS Y
    INNER JOIN(
        SELECT
            *,
            MIN(
                ABS(
                    DATEDIFF(`start`, '2021-05-01') + DATEDIFF(`end`, '2021-06-01')
                )
            ) AS diff
        FROM
            price
        GROUP BY
            objectid
    ) AS X
    ON
        X.objectid = Y.objectid AND X.diff = Y.diff
    ORDER BY
        Y.id
    

    o/p 是这个

    【讨论】:

    • 谢谢!你能检查一下我发布的解决方案是否也在做同样的事情吗?昨天晚上想出来的。
    • 我没有检查你的问题,你可以检查你自己,但是如果你的问题解决了,那么你可以通过接受我的回答来结束你的问题:)
    • 当然可以,只是想看看您或其他人是否在我的解决方案或更好的解决方案中发现了问题。
    • 你给它的解决方案没有运行并且有很多错误。您的解决方案无效。
    • 嗯,到目前为止运行良好。
    【解决方案2】:

    这是一个可行的解决方案,但我猜对差异进行连接可能会导致结果模糊。

    SELECT p.objectid,
        p.id
        p.start,
        p.end,
        p.price
    FROM
        prices AS p1
    INNER JOIN(
        SELECT
            p.objectid,
            MIN(
                ABS(
                    DATEDIFF(start, '2021-05-01') + DATEDIFF(end, '2021-06-01')
                )
            ) AS diff
        FROM
            prices p
        GROUP BY
            p.objectid
    ) p2
    ON
        p1.objectid = p2.objectid AND (ABS(DATEDIFF(p.start, '2021-05-01') + DATEDIFF(p.end, '2021-06-01'))) = p2.diff
    

    【讨论】:

      猜你喜欢
      • 2016-05-05
      • 2010-10-31
      • 2019-02-14
      • 1970-01-01
      • 2018-12-30
      • 2013-08-14
      • 2014-07-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多