2009-01-03 57 views
73

好吧,这里是我的困境我有一个数据库设置了大约5个表,所有的数据结构完全相同。数据以这种方式分离出来用于本地化目的,并将总共约450万条记录分开。MySQL - 从多个表中选择所有结构相同但数据不同的数据

大部分时间只需要一张桌子,一切都很好。但是,有时需要来自2个或更多表的数据,并且需要按照用户定义的列进行排序。这是我遇到问题的地方。

数据列:

id, band_name, song_name, album_name, genre 

MySQL的statment:

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

MySQL的吐出了这个错误:

#1052 - Column 'genre' in where clause is ambiguous 

很显然,我这样做是错误的。任何人都在意为我阐明这一点?

回答

167

我认为你正在寻找的UNION条款,一拉

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

谢谢你,我的作品究竟如何​​需要:) – Jayrox 2009-01-03 20:09:40

+0

好主意!一票。 – Sagotharan 2011-08-01 18:06:53

+0

@ mihai-limban - 抱歉打扰你,但是有没有办法从结果集中识别出“哪个结果来自哪个表”。因为如果我们需要从这个结果集中更新/删除一条记录,那就没有办法知道了。 – 2012-04-10 13:17:29

18

这听起来像你会happer有一个表。这五个具有相同的模式,并且有时需要像来自一个表格那样呈现,以将它们全部放在一个表格中。

添加一个新的列,可以用来区分五种语言(我假设它是语言,因为你说它是用于本地化的表之间不同)。不要担心有450万条记录。任何真正的数据库都可以处理这个大小没问题添加正确的索引,并且将它们作为单个表进行处理时不会遇到任何问题。

4

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

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

列不明确,因为它出现在两个表中你将需要完全指定where(或sort)字段,例如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

3

您最初试图跨越两个表创建一个隐式JOIN。这是大多数有经验的SQL程序员所不悦的,因为它将表格分开以便与如何组合。

UNION对于表格来说是一个很好的解决方案,但应该没有理由不能通过合适的索引将它们放入一张表中。我见过在大表中增加正确的索引可以将查询速度提高三个数量级。

3

union声明导致大量数据的处理时间。这是好事,在2个步骤进行选择:

  1. 选择ID
  2. 然后用它选择主表
相关问题