【问题标题】:Returning searched secondary ID rows, based on ID which can have more than one secondary ID根据可以有多个次要 ID 的 ID 返回搜索到的次要 ID 行
【发布时间】:2021-07-12 16:41:53
【问题描述】:

表 A 有 ID、次要 ID、客户名称、记录日期。

表 A ID 有时可能对同一客户有不同的辅助 ID。

表 B 有 ID,可以使用此 ID 加入表 A。

表 B 有 ID 和描述。

用户通过在表 A 中找到的辅助 ID 搜索客户。

我需要创建一些表 C 或结果,它们返回表 A 中的所有数据,除了加入其 ID 后来自表 B 的数据,但我还需要考虑不同的辅助 ID 的标准并且只包括跨 ID 和辅助 ID 的最新记录。

例如,辅助 ID 123、234 和 987 是同一个人 (Jane)。假设她结婚了,但对于她的某些记录,可能不会更新(因此 ID:1 和次要 ID:234 有名字 Jane Doe 和 Jane Brown)。

表 A:

|ID|Secondary ID|Customer First Name|Customer Last Name|Record  |
|--|------------|-------------------|------------------|--------|
|1 |123         |Jane               |Doe               |02/03/20|
|1 |123         |Jane               |Doe               |01/02/20|
|1 |234         |Jane               |Brown             |04/01/21|
|1 |234         |Jane               |Doe               |05/01/21|
|1 |987         |Jane               |Doe               |03/04/21|
|2 |567         |Jack               |Brown             |01/28/21|
|2 |567         |Jack               |Brown             |06/01/21|

表 B:

|ID|Description     |
|--|----------------|
|1 |A description   |
|2 |Some description|

如果用户搜索 Jane Doe 的辅助 ID 为 123,则她的实际最新记录在辅助 ID 234 下,最后记录日期为 05/01/21。 每当用户搜索 ID 123 时,我都需要返回该记录,该 ID 应该从该用户的搜索中显示,而不是 234。

结果:

|ID|Secondary ID|Customer First Name|Customer Last Name|Record|Description|
|--|------------|-------------------|------------------|--------|----------------|
|1 |123         |Jane               |Doe               |05/01/21|A description   |

另外,如果有人搜索一个只有一个 ID 的辅助 ID,它只需要返回最新的记录。

例如。用户搜索 567。结果应该是:

|ID|Secondary ID|Customer First Name|Customer Last Name|Record|Description|
|--|------------|-------------------|------------------|--------|----------------|
|2 |567         |Jack               |Brown             |06/01/21|Some description|

我怎样才能做到这一点?

【问题讨论】:

  • 如果 123 有两个不同的名字会发生什么?像 234
  • 只要是同一个人,就应该是同一个场景。 ID 是这里的主键。只需要客户在次要 ID 的某些搜索中的最新记录日期,即使搜索到的次要 ID 不是具有最新记录的 ID,也可以考虑该次要 ID 是否也与某个主要 ID 匹配(即。 ID:1 具有 123、234、978 作为可能的辅助 ID)。
  • 这似乎是一个数据库规范化问题。该名称应该在客户表中,而不是在表 A 的每一行中。当他们更改名称时,您在一个地方进行更新,它会反映在客户 ID 的所有使用中。
  • 这毫无意义,因为 bith 可以有不同的日期,并且算法可以选择正确的日期,所以你会得到两个甚至更多的结果
  • 不幸的是,无法控制可能会为数据库规范化带来此问题的数据库,只是尝试将其视为一种可能性并报告任何差异。

标签: mysql sql


【解决方案1】:
SELECT          A.ID, A.SecondaryID, A.CustomerFisrtName, A.CustomerLastName, A2.Record, B.Description
FROM            table_a AS A
    LEFT JOIN   table_b AS B ON B.ID = A.ID
    LEFT JOIN   table_a AS A2 ON A2.ID = (
                    SELECT          A3.ID
                    FROM            table_a AS A3
                    WHERE           A3.ID = A.ID
                    ORDER BY        A3.Record DESC
                    LIMIT           1
                )
WHERE           A.SecondaryID = 123;

具有规范化的 AUTO INCREMENT 主键的存在会使这种查询方式更快、更简单。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-22
    • 1970-01-01
    • 1970-01-01
    • 2016-06-18
    • 2021-12-31
    • 1970-01-01
    相关资源
    最近更新 更多