83

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

显然,我做错了。有人愿意为我解释一下吗?

4

6 回答 6

179

我认为您正在寻找UNION子句,a la

(SELECT * from us_music where `genre` = 'punk')
UNION
(SELECT * from de_music where `genre` = 'punk')
于 2009-01-03T20:00:37.413 回答
19

听起来你会喜欢一张桌子。这五个具有相同的模式,有时需要将它们呈现为好像它们来自一个表,这意味着将它们全部放在一个表中。

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

于 2009-01-03T20:00:43.483 回答
5

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

SELECT * from us_music, de_music where `us_music.genre` = 'punk' AND `de_music.genre` = 'punk'
于 2009-01-03T20:06:50.193 回答
4

该列是模棱两可的,因为它出现在两个表中,您需要完全指定 where(或排序)字段,例如 us_music.genre 或 de_music.genre,但如果您随后要将它们连接在一起,您通常会指定两个表一些时尚。您处理的结构有时被称为分区表,尽管它通常也将数据集分成不同的文件,而不是任意拆分数据集。如果您负责数据库结构并且没有充分的理由对数据进行分区,那么我将构建一个包含国家代码的额外“来源”字段的大表,但您可能出于正当的性能原因这样做. 使用联合来加入您对http://dev.mysql 感兴趣的表。或通过使用合并数据库引擎http://dev.mysql.com/doc/refman/5.1/en/merge-storage-engine.html

于 2009-01-03T20:12:00.323 回答
3

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

对于这些表来说,这UNION是一个很好的解决方案,但应该没有理由不能将它们放入一个具有良好索引的表中。我已经看到将正确的索引添加到大表中可以将查询速度提高三个数量级。

于 2009-01-05T23:51:04.437 回答
3

union声明导致大量数据的交易时间。最好分两步执行选择:

  1. 选择身份证
  2. 然后用它选择主表
于 2009-11-07T13:33:31.903 回答