MySQL – 从多个表中select所有结构相同但数据不同的数据
好吧,这里是我的困境我有一个数据库build立了大约5个表都完全相同的数据结构。 数据以这种方式分离用于本地化目的,并将总共约450万条logging分开。
大部分时间只需要一张桌子,一切都很好。 但是,有时需要从两个或更多表中获取数据,并且需要按照用户定义的列进行sorting。 这是我有问题的地方。
数据列:
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
显然,我做错了。 任何人都在意为我阐明这一点?
我想你在找UNION子句
(SELECT * from us_music where `genre` = 'punk') UNION (SELECT * from de_music where `genre` = 'punk')
这听起来像你会用单桌讨论。 五个具有相同的模式,有时需要像来自一个桌子一样呈现,将它们放在一张桌子上。
添加一个新的列,可以用来区分五种语言(我假设它的语言是不同的表之间,因为你说它是用于本地化)。 不要担心有450万条logging。 任何真正的数据库可以处理的大小没有问题。 添加正确的索引,并且将它们作为单个表进行处理并不困难。
以上任何一个答案都是有效的,或者另一种方法是扩展表名以包含数据库名 – 例如:
SELECT * from us_music, de_music where `us_music.genre` = 'punk' AND `de_music.genre` = 'punk'
该列是不明确的,因为它出现在两个表中,您将需要完全指定where(或sort)字段,例如us_music.genre或de_music.genre,但是如果您要将它们连接在一起,通常会指定两个表一些时尚。 你所处理的结构有时被称为分区表,尽pipe通常是将数据集分成不同的文件,而不是任意地分割数据集。 如果你负责数据库结构并且没有充分的理由对数据进行分区,那么我会build立一个包含国家代码的额外“origin”字段的大表,但是你可能为了合法的性能原因。 可以使用联合来join您感兴趣的表http://dev.mysql.com/doc/refman/5.0/en/union.html或使用合并数据库引擎http://dev.mysql.com /doc/refman/5.1/en/merge-storage-engine.html 。
跨越两个表的原始尝试会创build一个隐式JOIN。 这是由大多数有经验的SQL程序员皱起了眉头,因为它将表分开,以结合如何的条件。
UNION
对于表格来说是一个很好的解决scheme,但是没有理由不能用合适的索引将它们放在一张表格中。 我已经看到,添加正确的索引大表增加三个数量级的查询速度。
union
声明导致大量数据的交易时间。 分两步执行select是很好的:
- selectID
- 然后用它select主表