【问题标题】:Mysql - XML like table with multiple values in same columnMysql - 类似 XML 的表,在同一列中有多个值
【发布时间】:2020-04-24 07:45:22
【问题描述】:

我的问题标题令人困惑,对此感到抱歉。

我有一个应用程序以 XML'ish 格式将数据保存在数据库中,引用键和值。 问题是我只有一列有多个值对应于某个键。

我需要将某些键作为列,但我很难做到这一点:

下面是我的表格示例

xml_type    | xml_key | xml_content_key                                      | xml_content_value
----------------------------------------------------------------------------------------------------
Archiv::144 | 144     | [1]{'Version'}[1]{'Carrier'}[1]{'Content'}           | 151
Archiv::144 | 144     | [1]{'Version'}[1]{'CarrierID'}[1]{'Content'}         | 5714141614
Archiv::144 | 144     | [1]{'Version'}[1]{'CustomerInterface'}[1]{'Content'} | 145

所以,我可以运行它并拥有所有运营商:

select xml_content_key as Carrier, xml_content_value as 'Carrier Result'
from xml_storage xs where xml_content_key LIKE '%[1]{\'Version\'}[1]{\'Carrier\'}[1]{\'Content\'}%'

但是我如何将列 xml_content_key 中的其他键显示为列。 我尝试过嵌套选择,但得到“返回多个值”,连接将不适用,因为这是在单个表上。

简而言之,我想运行一个查询以从 xml_content_key 列中收集一些键,并将每个键放在一个新列中。

谢谢。

【问题讨论】:

  • MySQL 允许您将 XML 和 JSON 存储在列中。如果您不想规范化您的表格设计,请使用其中之一,而不是设计自己的格式。
  • 一般来说,将一列拆分为任意数量的结果并不容易。这就是为什么您首先应该将数据数组存储在单独的行中。
  • 你好 Barmar,谢谢你的评论,这个设计来自我工作的公司使用的一个应用程序,所以我现在没有机会改变它,你能指出我使用 XML 的方向吗, JSON 作为列?

标签: mysql


【解决方案1】:

在不知道您的表或 XML 文档的架构的情况下,我将不得不做出一些假设。但我认为这并不太难。首先,我将写出我所做的假设。如果这些假设是错误的,请纠正我。

您似乎有一个表,其中xml_content_key 应该是列名,xml_key 应该是行标识符。您在问题中只展示了非常有限的样本,但我的假设表明更多数据可能看起来像这样。

xml_type    | xml_key | xml_content_key                                      | xml_content_value
----------------------------------------------------------------------------------------------------
Archiv::144 | 144     | [1]{'Version'}[1]{'Carrier'}[1]{'Content'}           | 151
Archiv::144 | 144     | [1]{'Version'}[1]{'CarrierID'}[1]{'Content'}         | 5714141614
Archiv::144 | 144     | [1]{'Version'}[1]{'CustomerInterface'}[1]{'Content'} | 145
Archiv::144 | 145     | [1]{'Version'}[1]{'Carrier'}[1]{'Content'}           | 123
Archiv::144 | 145     | [1]{'Version'}[1]{'CarrierID'}[1]{'Content'}         | 4567891234
Archiv::144 | 145     | [1]{'Version'}[1]{'CustomerInterface'}[1]{'Content'} | 567
Archiv::144 | 146     | [1]{'Version'}[1]{'Carrier'}[1]{'Content'}           | 891
Archiv::144 | 146     | [1]{'Version'}[1]{'CarrierID'}[1]{'Content'}         | 2345678912
Archiv::144 | 146     | [1]{'Version'}[1]{'CustomerInterface'}[1]{'Content'} | 345

我认为您正在尝试编写一个查询来重新组织它。

+---------+---------+------------+-------------------+
| xml_key | Carrier | CarrierID  | CustomerInterface |
+---------+---------+------------+-------------------+
|     144 |     151 | 5714141614 |               145 |
|     145 |     123 | 4567891234 |               567 |
|     146 |     891 | 2345678912 |               345 |
+---------+---------+------------+-------------------+

如果我对这部分有误,那么继续阅读是没有意义的。但如果到目前为止我是对的,那么我想强调一下你问题中的一句话。 p>

连接不适用,因为它位于单个表上。

您错过了 SQL 的一项重要功能:self joins 在这种情况下非常有用。

似乎每个xml_key(或行)都有三个“内容键”(或列)。我们会将共享相同xml_key 的所有xml_content_key 连接在一起,这样每一行将描述一个xml_key。顺便说一句,我假设您的表名为 xml_storage

SELECT xs1.xml_key AS 'xml_key',
       xs1.xml_content_value AS 'Carrier',
       xs2.xml_content_value AS 'CarrierID',
       xs3.xml_content_value AS 'CustomerInterface'
FROM       xml_storage xs1
INNER JOIN xml_storage xs2 ON xs2.xml_key = xs1.xml_key
INNER JOIN xml_storage xs3 ON xs3.xml_key = xs1.xml_key
WHERE  xs1.xml_content_key LIKE "%[1]{'Version'}[1]{'Carrier'}[1]{'Content'}%"
   AND xs2.xml_content_key LIKE "%[1]{'Version'}[1]{'CarrierID'}[1]{'Content'}%"
   AND xs3.xml_content_key LIKE "%[1]{'Version'}[1]{'CustomerInterface'}[1]{'Content'}%"

这里的基本思想是我们将表格分成三个表格,然后将它们重新组合在一起。我们将运营商放在 xs1 中,将 CarrierID 放在 xs2 中,将 CustomerInterfaces 放在 xs3 中。然后我们将它们重新组合在一起,将与特定 xml_key 关联的所有内容放在同一行。

您可能需要更改它以适合您的实际架构。特别是,此查询假定每个唯一 xml_key 恰好有一个 Carrier、CarrierID 和 CustomerInterface。我相信,如果您的数据与我一直假设的一样,但不完善,这种通用方法将有效data 需要比我在此处给出的示例更强大的查询。

如果您可以分享有关您的特定架构的更多详细信息,我很乐意编辑我建议的查询以适合您的情况。

【讨论】:

  • 你好威廉,你的回复很棒,看起来很有希望,我唯一需要指出的是 xml_key 对所有行都是一样的,这个键就像一个类,在这种情况下xml_key 144 是用于电路的,所以我将拥有这个密钥 144,用于我系统上的尽可能多的电路。我现在正尝试在我的查询中进行这项工作。
  • @AAWW 您能否成功地将其调整为您的查询?如果所有行的 xml_key 都相同,那么您的行标识符是什么?它会是您的 xml_content_key 方括号中的索引号吗?我试图理解这个专栏,但我不认识查询语言。我假设您会为 XML 使用 XPath 或 XQuery,但似乎两者都不是。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-06-29
  • 2020-09-03
  • 1970-01-01
  • 2015-02-18
  • 1970-01-01
  • 1970-01-01
  • 2018-05-02
相关资源
最近更新 更多