MySQL - 从具有相同结构但数据不同的多个表中选择数据
Posted
技术标签:
【中文标题】MySQL - 从具有相同结构但数据不同的多个表中选择数据【英文标题】:MySQL - Selecting data from multiple tables all with same structure but different data 【发布时间】:2010-09-29 09:51:43 【问题描述】:好的,这是我的困境,我有一个数据库,其中包含大约 5 个表,所有表都具有完全相同的数据结构。出于本地化目的,数据以这种方式分离,总共拆分出大约 450 万条记录。
大多数时候只需要一张桌子,一切都很好。但是,有时需要来自 2 个或更多表的数据,并且需要按用户定义的列进行排序。这就是我遇到问题的地方。
数据列:
id, band_name, song_name, album_name, genre
mysql 语句:
SELECT * from us_music, de_music where `genre` = 'punk'
MySQL 吐出这个错误:
#1052 - Column 'genre' in where clause is ambiguous
显然,我做错了。有人愿意为我解释一下吗?
【问题讨论】:
【参考方案1】:我认为您正在寻找 UNION 子句,一个拉
(SELECT * from us_music where `genre` = 'punk')
UNION
(SELECT * from de_music where `genre` = 'punk')
【讨论】:
@mihai-limban - 很抱歉打扰您,但有没有办法从结果集中识别“哪个结果来自哪个表”。因为,如果我们需要从这个结果集中更新/删除一条记录,没有办法知道。 @Pushpesh 为每个SELECT
添加一个唯一的字符串标识符,例如:(SELECT 'us_music' AS from_table, * FROM us_music WHERE genre = 'punk') UNION ...
genre 的值是多少未知但 ids 应该在两个表中匹配?你能做这样的事情吗? (SELECT 1) AS select1 UNION (SELECT 2) AS select2 WHERE select1.id=select2.id
完美,正是我喜欢 Stack 的原因!谷歌,在这里找到堆栈问题和答案!谢谢!
对结果集的 UNION 进行分组然后还执行排序依据的语法是什么?假设它是viewCount
和movieTitle
,每个月都有一个数据库。您将所有 12 个表合并在一起,这很好,但随后您会在输出中获得 12 个单独的结果集。如果您只想要一个结果集,其中所有结果都按 movieTitle
分组,并且每个 movieTitle
行的 viewCount
值相加,该怎么办?【参考方案2】:
听起来你会喜欢一张桌子。这五个具有相同的架构,有时需要将它们呈现为好像它们来自一个表一样指向将它们全部放在一个表中。
添加一个可用于区分五种语言的新列(我假设它是表中不同的语言,因为您说它是用于本地化的)。不要担心有 450 万条记录。任何真正的数据库都可以处理这个大小没有问题。添加正确的索引,您就可以轻松地将它们作为单个表处理。
【讨论】:
我最初将所有数据放在一个表中,但在大约 350 万条记录之后,它开始几乎爬了 5-10 秒。我发现拆分它对我来说效果最好,因为它要快得多。我现在有一个新的虚拟主机,所以它可能会更好,但组合起来似乎太麻烦了 听起来您需要为表添加索引。 是的,您基本上处理了问题的症状,但没有解决核心问题(索引不正确/不足)。如果您的 5 个表中的一个达到 450 万行并再次开始爬网,接下来会发生什么?【参考方案3】:以上任何一个答案都是有效的,或者另一种方法是扩展表名以包含数据库名 - 例如:
SELECT * from us_music, de_music where `us_music.genre` = 'punk' AND `de_music.genre` = 'punk'
【讨论】:
这会给你一个非常不明确的结果集:所有可能的 us_ 和 de_ punk 对。【参考方案4】:该列不明确,因为它出现在两个表中,您需要完全指定 where(或排序)字段,例如 us_music.genre 或 de_music.genre,但如果您要加入,通常会指定两个表他们以某种方式在一起。您处理的结构有时被称为分区表,尽管它通常也将数据集分成不同的文件,而不是任意拆分数据集。如果您负责数据库结构并且没有充分的理由对数据进行分区,那么我将构建一个包含国家代码的额外“来源”字段的大表,但您可能出于正当的性能原因这样做. 要么使用联合来加入您感兴趣的表http://dev.mysql.com/doc/refman/5.0/en/union.html,要么使用合并数据库引擎http://dev.mysql.com/doc/refman/5.1/en/merge-storage-engine.html。
【讨论】:
【参考方案5】:您最初尝试跨越两个表会创建一个隐式 JOIN。大多数有经验的 SQL 程序员都不赞成这种做法,因为它将要组合的表与如何组合的条件分开。
UNION
对于这些表来说是一个很好的解决方案,但应该没有理由不能将它们放入具有良好索引的一个表中。我已经看到将正确的索引添加到大表中可以将查询速度提高三个数量级。
【讨论】:
【参考方案6】:union
语句会导致大量数据的交易时间。最好分两步执行选择:
-
选择ID
然后用它选择主表
【讨论】:
以上是关于MySQL - 从具有相同结构但数据不同的多个表中选择数据的主要内容,如果未能解决你的问题,请参考以下文章