MySQL-从结构相同但数据不同的多个表中选择数据

好吧,这是我的困境,我有一个数据库设置了大约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

很明显,我做错了,有人能解释一下吗?

187531 次浏览

我觉得你是在找 工会条款

(SELECT * from us_music where `genre` = 'punk')
UNION
(SELECT * from de_music where `genre` = 'punk')

听起来你更喜欢单人桌。五个具有相同的模式,有时需要被表示为好像他们来自一个表点,把它们全部放在一个表中。

添加一个新列,该列可用于区分五种语言(我假设它是用于本地化的语言,因此表之间的语言是不同的)。别担心有450万张唱片。任何真正的数据库都可以处理这个大小没有问题。添加正确的索引,就可以将它们作为单个表处理。

以上任何一个答案都是有效的,或者另一种方法是扩展表名以包括数据库名称——例如:

SELECT * from us_music, de_music where `us_music.genre` = 'punk' AND `de_music.genre` = 'punk'

该列是不明确的,因为它出现在两个表中,您需要完全指定 where (或 sort)字段,例如 us _ music。流派或者音乐。但是你通常会指定两个表,如果你要把它们以某种方式连接在一起。您处理的结构有时被称为分区表,尽管它通常也会将数据集分成不同的文件,而不仅仅是任意分割数据集。如果你负责数据库结构,并且没有很好的理由对数据进行分区,那么我会构建一个带有额外“原点”字段的大表,该字段包含一个国家代码,但是你这样做可能是出于合法的性能原因。 要么使用联合来连接您感兴趣的 http://dev.mysql.com/doc/refman/5.0/en/union.html表,要么使用 Merge 数据库引擎 http://dev.mysql.com/doc/refman/5.1/en/merge-storage-engine.html

最初跨越这两个表的尝试会创建一个隐式 JOIN。大多数经验丰富的 SQL 程序员都不赞成这种做法,因为它将要组合的表与如何组合的条件分开。

UNION对于这些表来说是一个很好的解决方案,但是没有理由不能将它们放到一个具有良好索引的表中。我见过在一个大型表中添加正确的索引会使查询速度提高三个数量级。

union语句导致海量数据中的交易时间。最好分两步执行选择:

  1. 选择 ID
  2. 然后用它选择主表