从单个表中拆分MySQL中的数据
我有一张非常破旧的桌子:从单个表中拆分MySQL中的数据,mysql,Mysql,我有一张非常破旧的桌子: meetingid_bigint key field_prompt data_string 1 meeting_name Meeting Name Introduction 1 location_text Location Place Main Office 1 location_street Street Ad
meetingid_bigint key field_prompt data_string
1 meeting_name Meeting Name Introduction
1 location_text Location Place Main Office
1 location_street Street Address Street number 1
1 location_town Location Town Town
1 time_start Start Time 10.00 AM
2 meeting_name Meeting Name Follow Up
2 location_text Location Place Office
2 location_street Street Address Street number 2
2 location_town Location Town Town 2
2 time_start Start Time 1.00 PM
3 meeting_name Meeting Name Introduction
3 location_text Location Place Main Office
3 location_street Street Address Street number 1
3 location_town Location Town Town
3 time_start Start Time 8.00 AM
等等,大约有4000条记录。正如你们所看到的,同一个会议以一个新的号码一次又一次地举行。我想从数据字符串
中分离出不同的会议名称
,位置
,位置
和开始时间
数据,这样我就可以将其放在单独的表中,并改用FK。这张桌子太疯狂了。所以问题是,如何在一个提取查询中获得所有具有相同名称和地点的会议?唯一的区别是时间。会议名称始终跟随城镇和地址
输出:
MeetingName Location Town Address
Introduction Main Office Town 1 Street number 1
Follow Up Office Town 2 Street number 2
差不多吧
编辑
谢谢你,巴兰卡,这有点帮助
但现在我得到了这个输出:
meetingid_bigint MeetingName Location Town Address
1 Introduction
1 Main Office
1 Town 1
1
2 Follow Up
2 Office
2 Town 2
2 Street Number 2
3 Street Number 1
3
3
3 Town 1
尝试通过“MeetingName”更改为组,然后我几乎得到了我想要的结果,所有的MeetingName都按顺序排列,没有配音,但没有位置、城镇或地址
select meetingid_bigint
, case `key` when 'meeting_name' then data_string end as MeetingName
, case `key` when 'location_name' then data_string end as Location
, case `key` when 'location_street' then data_string end as Address
from main_meeting_table
group by MeetingName, Town
那个密码给了我会议的名字和城镇,但首先是所有的名字,然后是所有的城镇。这是正确的,所以问题是,我能以某种方式加入这两个人吗?你会很痛苦的。您需要创建一个“透视”查询
MySQL不提供内置指令来构建pivot查询,但您可以手动构建:
select meeting_id
, case `key` when 'meeting_name' then data_string end as MeetingName
, case `key` when 'location_name' then data_string end as Location
, case `key` when 'location_street' then data_string end as Address
-- And so on
from your_table
group by meeting_id;
希望这有帮助
小评论:避免使用保留关键字(如键
)作为列名请编辑您的问题并显示您想要的结果。如果要将值放在一行中,则称为轴。你可以在谷歌上搜索“MySQL pivot”来找到实现这一点的方法。如果每次会议都可能有不同数量的属性与之关联,那么这种数据结构实际上并没有那么糟糕,特别是因为每个属性(键、字段提示、数据字符串)似乎都有不同的值关联。这实际上是在关系数据库中存储这些排序配置关系的一种非常常见的方法。现在,如果您发现每次会议总是只有5个属性,那么像您建议的那样的表结构可能是有意义的。在这种情况下,我认为您将有16个字段(id加上3*5个属性字段)。@MikeBrant是的,我知道,但我也需要从其他方面来解释为什么需要拆分它。是的,如果有人维护数据库并且熟悉它,这种结构就可以工作。问题是情况并非如此,而且还涉及其他表。因此,在本例中,我必须对多个具有相同值和联接的表进行查询。我的想法是将它分解为尽可能少的查询,并且至少让非sql人员更容易理解它。