【问题标题】:Query: How to get data from another row to fill lacking data?查询:如何从另一行获取数据以填充缺少的数据?
【发布时间】:2022-01-13 15:55:48
【问题描述】:

(我真的很难用几句话正确地问这个问题,所以很抱歉标题。我尽力了。)

我有一个这样的数据库:

id animal date no
1 dog blank 0
2 cat blank 0
3 dog 07/12 2021 3
4 dog 08/12 2021 2
5 cat 08/12 2021 4

(该表是 Android Studio 中使用 java 的较大项目的简化表。)

我想查询这个数据库以便:

  • 我在某天得到动物
  • 如果某天没有给动物,我想要那个动物所在的行和一个空白日期

例子:

  • 如果日期是 2021 年 8 月 12 日,我想要 id 为 4 和 5 的行。
  • 如果日期是 2021 年 7 月 12 日,我想要 id 为 3 和 2 的行(那天没有猫)
  • 如果日期是 2021 年 6 月 12 日(或任何其他日期),我想要 id 为 1 和 2 的行(那天没有猫和狗)

我知道我可以从某个日期加上那些日期空白的,通过:

@Query("SELECT * 
        FROM db 
        WHERE (db.date LIKE :date OR db.date LIKE :blank) 
        ORDER BY no ASC")

但是,我怎样才能得到我想要的呢?

【问题讨论】:

  • id 1 和 2 行是某种“虚拟”行吗?奇怪的设计。
  • 是的,请客气。它们应该是“后备”选项。 (为了让问题更容易理解,我省略了一些列,但这些列包含我需要的信息。)
  • 将“Top 1”添加到您的查询中,您就解决了。
  • 动物是固定的吗?只有狗还是猫?还是有-n-动物?
  • 可以有没有任何“空白日期”的“牛”。但如果能在没有“牛”的情况下解决我的问题,那肯定聊胜于无!

标签: mysql sql


【解决方案1】:

根据您的示例数据,我认为您的数据模型设置不正确。

你会发现这个数据有问题:

id animal date no
6 cat 09/12 2021 2
7 cat blank 0
8 dog 12/12 2021 3

→ 因此,当您的最后一个日期小于您的请求日期时,您必须计算最后一个有效日期和上一个有效日期之间的时间差,并且必须做出差异。

例如在 2021 年 11 月 11 日申请,您的最后一个有效日期是 2021 年 9 月 12 日

最好为每个 INSERT 设置一个系统时间戳。 像这样的:

id animal date no change_date
6 cat 09/12 2021 2 09/12 2021
7 cat blank 0 10/12 2021
8 dog 12/12 2021 3 12/12 2021

使用此设置,您的优势在于您不必将 ID 隐式分配给可能的日期。

这样可以很容易地查询结果:

SELECT
  *
FROM
  db
WHERE
  db.change_date = '11/12 2021'

更新

如果您只想显示某个日期的可用结果:

@Query("SELECT * 
        FROM db 
        WHERE (db.date LIKE :date OR db.date LIKE :blank) AND db.animal = 'cat'
        ORDER BY nr ASC limit 1
        UNION ALL
        SELECT * 
        FROM db 
        WHERE (db.date LIKE :date OR db.date LIKE :blank) AND db.animal = 'dog'
        ORDER BY nr ASC limit 1")

【讨论】:

  • 我想我明白你的意思,非常感谢你的时间!但是我看到我的问题还不够清楚。 (抱歉,我觉得很难说清楚!)如果我要求 2021 年 11 月 11 日,而我那里既没有猫也没有狗,我只想要空的。我不想要之前的有效日期,而是我在该日期拥有的日期或空的日期。这有意义吗?
  • 在更新的部分中,您将使用 UNION 函数获得 'cat' 和 'dog' 的结果。
  • 不错!是否可以遍历查询中的动物?还是每次添加新的动物类型时都必须更改查询? (会有许多种动物。)
【解决方案2】:

经过几个小时的谷歌搜索,我实际上找到了答案。真的很简单,我觉得我应该早点得到它:

@Query("SELECT *, MAX(db.id) FROM db WHERE (db.date LIKE :date OR db.date LIKE :blank) GROUP BY db.animal")

由于数据是按动物分组的,因此这段代码只是给出了每只动物的最大 id 行。再简单不过了。

【讨论】:

    猜你喜欢
    • 2020-08-14
    • 2021-03-06
    • 1970-01-01
    • 2020-05-31
    • 1970-01-01
    • 1970-01-01
    • 2021-08-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多